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 }

 

你可能感兴趣的:(open)