题意:给出总资金和投资年份 ,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;
}