题目:点击打开链接
题意:给你一个本金和要存的年数N,再给你n种不同的股票,第i种股票的价格cost为c[i],价值value为v[i]。求怎么买股票N年后得到最多的总额(本金+利息)。
解法:股票价格都是1000的倍数,所以通过将每种股票价格/1000且背包容量/1000进行所占空间的优化。背包容量每年都要更新。
状态转移方程:dp[j]=max(dp[j],dp[j-c[i]]+v[i])。 表示背包容量为j时的最大总额。i从1到n,j从c[i]到sum。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int t,m,n,year,sum,c[10000],v[10000],dp[200000];
cin>>t;
while(t--)
{
cin>>m>>year;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>c[i]>>v[i];
c[i]/=1000;
}
sum=m;
for(int k=1;k<=year;k++)
{
sum=m;
sum/=1000;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=c[i];j<=sum;j++)
dp[j]=max(dp[j],dp[j-c[i]]+v[i]);
m+=dp[sum];
}
cout<<m<<endl;
}
return 0;
}