OpenJudge 2773 2726 2727 采药

1.链接地址:

http://bailian.openjudge.cn/practice/2773/

http://bailian.openjudge.cn/practice/2726/

http://bailian.openjudge.cn/practice/2727/

2.题目:

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

如果你是辰辰,你能完成这个任务吗?
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
Source
NOIP 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 }
原文地址:https://www.cnblogs.com/mobileliker/p/3584517.html