poj 2063完全背包

来源:互联网 发布:sql 别名的使用 编辑:程序博客网 时间:2024/05/21 05:58

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


 

原创粉丝点击