问题 A: 【动态规划】采药_二维数组_一维数组

问题 A: 【动态规划】采药

时间限制: 1 Sec  内存限制: 64 MB
提交: 35  解决: 15
[提交][状态][讨论版]

题目描述

山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值,在一段时间内如何让采到的草药价值最大。

输入

第一行有两个用空格隔开的整数T和M(1≤T,M≤100),T代表总共采药时间,M代表草药数目。接下来的M行每行包括两个在1到100之间(包括1和100)的整数,分别表示采摘某种草药的时间和这株草药的价值。

输出

只包含一个整数,表示在规定的时间内可以采到的草药的最大总价值。

样例输入

70 3
71 100
69 1
1 2

样例输出

3

解题思路:实际就是01背包,用二维数组的时候注意:需要考虑j<t[i]的情况,因为后面会有用到dp[i-1][j-t[i]] (j<t[i])的情况。
  所以还是学着用一维数组做01背包吧,既节省空间有不用考虑这么多情况。
代码:二维数组:
#include<cstdio>
#include <iostream>
#include <cstring>

using namespace std;

int dp[1005][1005];

int main(){
    int T;
    int M;
    int maxx=0;

    int t[1111];
    int p[1111];
    while(scanf("%d %d",&T,&M)!=EOF){
        maxx=0;
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=M;i++){
            scanf("%d %d",&t[i],&p[i]);
        }
        for(int i=1;i<=M;i++){
            for(int j=1;j<=T;j++){
                if(j>=t[i]){
                    dp[i][j]=max(dp[i-1][j],dp[i-1][j-t[i]]+p[i]);
                }else{
                    dp[i][j]=dp[i-1][j];
                }
            }
        }
        printf("%d\n",dp[M][T]);
    }
    return 0;
}

 

一维数组:
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 
 5 using namespace std;
 6 
 7 int a[1005]={0};
 8 int t[1005]={0};
 9 int p[1005]={0};
10 
11 void zeroonepack(int T,int t,int p){
12     for(int i=T;i>=t;i--){
13         a[i]=max(a[i],a[i-t]+p);
14     }
15 }
16 
17 int main()
18 {
19     int T,M;
20     while(scanf("%d %d",&T,&M)!=EOF){
21         memset(a,0,sizeof(a));
22         for(int i=0;i<M;i++){
23            scanf("%d %d",&t[i],&p[i]);
24         }
25         for(int i=0;i<M;i++){
26             zeroonepack(T,t[i],p[i]);
27         }
28         printf("%d\n",a[T]);
29     }
30     return 0;
31 }

 





posted @ 2016-08-15 17:21  多一份不为什么的坚持  阅读(477)  评论(0编辑  收藏  举报