POJ 2063 Investment(完全背包--容量变化)

题目大意:给你一笔金额,你要将这比金额去投资,现在有t种股票,每种股票都有一个价值和年收益,问你如何投资在n年后的最大收益

思路:由于获益后的钱加上本金可以再来投资,所以背包容量变化,这点还是不难的,主要本题给了一个信息:股票的价值都是1000的倍数,所以后面可以空间优化,对每个价值除以1000对背包容量优化

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int w[15],v[15];
int dp[100000];
int main()
{
    int T;
    scanf("%d",&T);
    int s,y;
    while(T--)
    {
        scanf("%d%d",&s,&y);
        int m;
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
            scanf("%d%d",&w[i],&v[i]);
        for(int i=1;i<=m;i++) w[i]/=1000;
        int ans=s;
        while(y--)
        {
            int mmax=ans/1000;
            memset(dp,0,sizeof(dp));
            for(int i=1;i<=m;i++)
                for(int j=w[i];j<=mmax;j++)
                    dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
            ans+=dp[mmax];
        }
        printf("%d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(POJ 2063 Investment(完全背包--容量变化))