题目:http://acm.hdu.edu.cn/showproblem.php?pid=1963
题意:
给了初始资金和年数,接下来是买每种债券的前和年收益,求n年后最大收益。
思路:
背包问题就是套。
花费是重量,利息是价值,能买无穷多个,不超过初始资金(容量)。用完全背包。
val是初始资金,再加上每年的收益作为下一年的本金。
#include<bits/stdc++.h>
using namespace std;
int dp[100005],w[100],v[100];
int main(){
int s,n,m,t;
cin>>t;
while(t--){
cin>>s>>n>>m;
for(int i=1;i<=m;i++){
cin>>w[i]>>v[i];
w[i]/=1000;
}
int val=s;//连本带息的每年投资数
for(int i=1;i<=n;i++){
s=val/1000;
memset(dp,0,sizeof(dp));
for(int j=1;j<=m;j++) //完全背包
for(int k=w[j];k<=s;k++)
dp[k]=max(dp[k-w[j]]+v[j],dp[k]);
val+=dp[s];
}
cout<<val<<endl;
}
return 0;
}