您的位置:首页 > 运维架构

OpenJudge 2773 2726 2727 采药

2014-12-04 13:06 169 查看
1.链接地址:
http://bailian.openjudge.cn/practice/2773/ http://bailian.openjudge.cn/practice/2726/ http://bailian.openjudge.cn/practice/2727/
2.题目:

总Time Limit:1000msMemory Limit:65536kBDescription辰辰是个很有潜能、天资聪颖的孩子,他的梦想是称为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出 了一个难题。医师把他带到个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给 你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”

如果你是辰辰,你能完成这个任务吗?Input输入的第一行有两个整数T(1 <= T <= 1000)和M(1 <= M <=
100),T代表总共能够用来采药的时间,M代表山洞里的草药的数目。接下来的M行每行包括两个在1到100之间(包括1和100)的的整数,分别表示采
摘某株草药的时间和这株草药的价值。Output输出只包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。Sample Input
70 3
71 100
69 1
1 2

Sample Output
3

SourceNOIP 2005
3.思路:

背包问题,dp模板题

由于规模小,直接使用未优化的背包问题解法即可

4.题目:

提供两个版本的答案

(1)未优化数组的,比较容易看懂

1 #include <iostream>
2 #include <cstdio>
3
4 using namespace std;
5
6 int main()
7 {
8     //freopen("C://input.txt","r",stdin);
9
10     int i,j;
11
12     int t,m;
13     cin >> t >> m;
14
15     int *arr_time = new int[m];
16     int *arr_value = new int[m];
17
18     for(i = 0;i < m; ++i) cin >> arr_time[i] >> arr_value[i];
19
20     int **dp = new int*[m];
21     for(i = 0;i < m; ++i) dp[i] = new int[t + 1];
22
23     for(i = 0; i < arr_time[m - 1] && i <= t; ++i) dp[m - 1][i] = 0;
24     for(i = arr_time[m - 1]; i <= t; ++i) dp[m - 1][i] = arr_value[m - 1];
25
26     for(i = m - 1 - 1; i >= 0; --i)
27     {
28         for(j = 0; j < arr_time[i] && j <= t; ++j) dp[i][j] = dp[i + 1][j];
29         for(j = arr_time[i]; j <= t; ++j) dp[i][j] = dp[i + 1][j] > (dp[i + 1][j - arr_time[i]] + arr_value[i]) ? dp[i + 1][j] : (dp[i + 1][j - arr_time[i]] + arr_value[i]);
30     }
31
32     int max = 0;
33     for(j = 0; j <= t; ++j) if(max < dp[0][j]) max = dp[0][j];
34
35     cout << max << endl;
36
37     for(i = 0; i < m; ++i) delete [] dp[i];
38     delete [] dp;
39
40     delete [] arr_time;
41     delete [] arr_value;
42
43     return 0;
44 }


 

(2)优化数组的

1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4
5 using namespace std;
6
7 int main()
8 {
9     //freopen("C://input.txt","r",stdin);
10
11     int i,j;
12
13     int t,m;
14     cin >> t >> m;
15
16     int *arr_time = new int[m];
17     int *arr_value = new int[m];
18
19     for(i = 0;i < m; ++i) cin >> arr_time[i] >> arr_value[i];
20
21     int *dp = new int[t + 1];
22     memset(dp,0,sizeof(int) * (t + 1));
23
24     for(i = m - 1; i >= 0; --i)
25     {
26         for(j = t; j >= arr_time[i]; --j) dp[j] = dp[j] > (dp[j - arr_time[i]] + arr_value[i]) ? dp[j] : (dp[j - arr_time[i]] + arr_value[i]);
27     }
28
29     int max = 0;
30     for(j = 0; j <= t; ++j) if(max < dp[j]) max = dp[j];
31
32     cout << max << endl;
33
34     delete [] dp;
35
36     delete [] arr_time;
37     delete [] arr_value;
38
39     return 0;
40 }


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: