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 }