题意:给出总资金和投资年份 ,n个股票 给出股票价格和其一年的利润。问如何选择能获得最大利润。
思路:股票可以重复选择,完全背包问题,完全背包也是从01背包衍生而行的,其主要区别在于中间那层循环的次序不同,因为完全背包没有次数的限制,因而其当前状态会受到之前选择的状态影响。
这题由于每个股票的价格都是1000为单位的,所以将价格除掉1000,优化内存。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,T,price,year,sum;
int v[20],w[20],dp[200005];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&price,&year);
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&v[i],&w[i]);
v[i]/=1000;
}
sum=0;
for(int i=0;i<year;i++)
{
memset(dp,0,sizeof(dp));
sum=price/1000; //可投资的钱
for(int j=0;j<n;j++)
{
for(int k=0;k<=sum;k++)
{
if(k>=v[j])
{
dp[k]=max(dp[k],dp[k-v[j]]+w[j]);
}
}
}
price+=dp[sum]; //资金加上投资获得的利润
}
printf("%d\n",price);
}
return 0;
}