- 采药
- 2016-09-16 13:54:07 @
#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 条评论
-
TLECODE LV 7 @ 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