題意: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;
}