/ Vijos / 讨论 / 采药 /

DP做的,不知道为啥WA了……样例过了

#include <cstdio>
int t,m,f[101][1001];//f[i][j]代表前i个物品在剩余j时间时价值的最大值
struct{
    int t,v; //t是采摘需要的时间,v是价值
}data[101];
int main(){
    scanf("%d%d",&t,&m);
    for(int i =1;i <= m;i++){
        scanf("%d%d",&data[i].t,&data[i].v);
    }
    //输入
    for(int i = 0;i <= m;i++){
        f[i][0] = 0;
    }
    for(int i = 0; i <=t;i++){
        f[0][i] = 0;
    }
    //初始化
    for(int i = 1; i <= m;i++){
        for(int j = 1;j <=t;j++){
            int itmTime = data[i].t,itmValue = data[i].v; //这两个变量分别是正在计算的物品的消耗时间和价值
            f[i][j] = itmTime <= j? f[i-1][j-itmTime] + itmValue : f[i-1][j];
        }
    }
    printf("%d\n",f[m][t]);
}

2 条评论

  • @ 2016-09-17 16:46:03

    你做的是多重背包,01背包第二重循环要逆搜。

  • @ 2016-09-17 16:44:48

    #include<stdio.h>
    #include<iostream>
    using namespace std;
    int f[1005];
    int main(){
    int v,n,t,c,i;
    scanf("%d%d",&v,&n);
    while(n--){
    scanf("%d%d",&t,&c);
    for(i=v;i>=t;i--){
    f[i]=max(f[i],f[i-t]+c);
    }
    }
    for(i=0,c=0;i<=v;i++){
    c=max(c,f[i]);
    }
    printf("%d\n",c);
    return 0;
    }
    水题

  • 1

信息

ID
1104
难度
4
分类
动态规划 | 背包 点击显示
标签
递交数
16861
已通过
6541
通过率
39%
被复制
41
上传者