• 问题 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
    ",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
    ",a[T]);
    29     }
    30     return 0;
    31 }




  • 相关阅读:
    POJ 1082 博弈推规律
    博弈论总结
    POJ 2502 Subway 关键在建图
    【算法设计与数据结构】为何程序员喜欢将INF设置为0x3f3f3f3f?
    一位ACMer过来人的心得
    POJ1724 Dij队列优化邻接表
    Dijkstra队列优化矩阵版
    Uva247 Floyd传递闭包+map处理
    简爬新浪新闻网
    爬href链接
  • 原文地址:https://www.cnblogs.com/TWS-YIFEI/p/5773718.html
Copyright © 2020-2023  润新知