您的位置:首页 > 程序相关 > 小飞侠的游园方案

小飞侠的游园方案

问题描述
经过抽签选择,小智将军第一个进入考场。
  菜虫:(身上散射出华贵(?)的光芒)欢迎你,第一位挑战者!!
  小智:……(走到菜虫身后,关灯)女王陛下,虽然我们国家现在很富裕,但也请您不要浪费电来用这么大功率的灯泡。
  菜虫(汗):啊啊~~爱卿所言甚是~~那么,你的题目是……我们的情报组织探听到敌人的重要将领——小飞侠星期天会邀他的灵儿妹妹到公园去玩。公园里有很多娱乐项目,可并不是每一项他们都喜欢,所以他们对每一项都进行了“喜欢度”的评分。因为小飞侠也是一个了不起的角色,所以他一定会选择在有限时间内的最好的方案。现在要你做的就是找出在规定时间内他们选择哪几项不同的活动可以使其“喜欢度”之和达到最大,据此我们就可以知道他会在哪些地方出现,从而在那里派人看守了。

  小智:(灯泡一亮)每个地方都派人看守不就行了?!
  “当~~~”
  菜虫:(手执八公分直径炒锅,筋)……你是白痴吗?-_-##(都派人去看守的话我们会有多少桌三缺一?!)听好了,输入格式是第一行一个正整数N(1<=N<=100)表示总共的娱乐项目数;第二行一个正整数表示规定的时间t(0

样例输入 Sample Input
3
5
1 2
5 5
4 3

样例输出 Sample Output
5

算法分析
简单的动态规划

0/1 背包

f[i,j]:=max{f[i-1,j], f[i-1,j-t[i]]+a[i]}

【代码】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <string.h>
#define max(a,b)a>b?a:b
int main()
{
       int n, m, i, j;
       int b[101][1001];
       int time[101], like[101];
 
       scanf("%d%d", &n, &m);
       for (i = 1; i <= n; i++)
       {
              scanf("%d%d", &like[i], &time[i]);
       }
 
       memset(b, 0, sizeof(int) * 101 * 1001);
 
       for ( i = 1; i <= n; i++)
       {
              for (j = 1; j <= m; j++)
              {
                     if (time[i] > j)
                            b[i][j] = b[i - 1][j];
                     else
                            b[i][j] = max(b[i - 1][j], b[i - 1][j - time[i]] + like[i]);
              }
       }
       printf("%ld\n", b[n][m]);
       return 0;
}
本文地址:小飞侠的游园方案    文章出处:PHP源码阅读,PHP设计模式,PHP学习笔记,项目管理-胖胖的空间

转载请以链接形式注明原始出处和作者,谢绝不尊重版权者抄袭!

暂无留言我要留言

必填

必填,绝不公开

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word