poj 2063完全背包

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


 

原文地址:https://www.cnblogs.com/amourjun/p/5134117.html