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
Sample Output
SourceNOIP 2005
3.思路:
背包问题,dp模板题
由于规模小,直接使用未优化的背包问题解法即可
4.题目:
提供两个版本的答案
(1)未优化数组的,比较容易看懂
(2)优化数组的
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 }
相关文章推荐
- OpenJudge 2773 2726 2727 采药
- OpenJudge-Noi 1775:采药(0-1背包问题)
- OpenJ_Bailian - 2773 采药(DP)
- [OpenJudge] 2727 仙岛寻药
- 百炼-2773-采药-C语言-01背包
- poj 2726:采药
- 百炼-2726:采药
- OpenJudge_P1775 采药(01背包)
- OpenJudge 2.6-1775 采药
- POJ 2773 Happy 2006
- POJ 2773 欧几里德
- poj 2773 Happy 2006解题报告 <欧拉函数>
- RQNOJ 15采药(0/1背包)
- OpenJudge 2712
- 1048: 采药2
- 【openjudge】数字统计
- POJ 2773 Happy 2006 二分 and 容斥原理 or 欧拉函数
- sicily 1146 采药
- COJ 1003采药:背包问题(1到m)
- Openjudge计算概论-计算矩阵边缘元素之和