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