题意 :m多的钱 一共years年 d多个基金,第i个基金需要 花费cost[i],收益w[i]。问最大能收益多少?
每一年是一个多重背包问题。。那么一共years个背包问题。
卡就卡在开多大数组。因为开不了那么大的数组。。所以,因为基金都是1000的倍数,所以把m和基金的花费都缩小1000去进行背包求解,得到的解用未缩小的总钱数去加,然后再缩小1000去求解下一年的。
#include<stdio.h>
#include<string.h>
int v[200000],cost[10000],w[10000];
int n,m,d,years;
int max(int a,int b){
return a>b?a:b;
}
int main(){
int cas;
scanf("%d",&cas);
while(cas--){
scanf("%d%d%d",&m,&years,&d);
for(int i=1;i<=d;i++){
scanf("%d%d",&cost[i],&w[i]);
cost[i]/=1000;
}
n=m;
for(int i=1;i<=years;i++){
n=m;
n/=1000;
memset(v,0,sizeof(v));
for(int j=1;j<=d;j++){
for(int k=cost[j];k<=n;k++){
v[k]=max(v[k],v[k-cost[j]]+w[j]);
}
}
m+=v[n];
}
printf("%d\n",m);
}
return 0;
}