题意:John有X元钱。现在有D种理财产品,给出每种理财产品的价格(1000的整数倍),每年得到的回报。现在John想投资N年,问得到的最大回报是多少。
思路:一件物品可以买无限次,这是个标准的完全背包。因为每年得到的回报可以作为下一年的资金,所以这里要发生变化的是背包的容量。
代码如下:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAX = 50000;
int dp[MAX],w[MAX],v[MAX];
int main(void)
{
//freopen("input.txt","r",stdin);
int T,V,N,D;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&V,&N,&D);
for(int i = 0; i < D; ++i){
scanf("%d%d",&w[i],&v[i]);
w[i] /= 1000;
}
for(int u = 0; u < N; ++u){
int M = V / 1000;
memset(dp,0,sizeof(dp));
for(int i = 0; i < D; ++i)
for(int j = w[i]; j <= M; ++j)
dp[j] = max(dp[j],dp[j-w[i]]+v[i]);
V += dp[M];
}
printf("%d\n",V);
}
return 0;
}