POJ 2063 Investment 完全背包

题意:给你一些钱去投资,现在有n种股票,每种股票都有一个价值和年收益,问你如何投资在d年后的最大收益
并且股票的价值都是1000的倍数,预处理:对每个价值除以1000,减少内存。

完全背包,

每投资一年,你的钱会变多,即背包总容量会变大。

对每一年的资金进行完全背包,然后更新背包总容量,d次循环后得出答案

dp上界:每次投资最多获利本金的10%,所以先写个程序计算出dp上界 1000000.0*pow(1.1,40)/1000=45259

View Code
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int w[11],p[11];
int dp[45555];
int main()
{
    int cas, i, j, t, m, n, x, sum;
    scanf("%d",&cas);
    while(cas--)
    {
        scanf("%d%d%d",&m,&t,&n);
        for(i=1;i<=n;i++)
            scanf("%d%d",&w[i],&p[i]),w[i]/=1000;
        for(x=1;x<=t;x++)
        {
            sum=m/1000;
            memset(dp,0,sizeof(dp));
            for(i=1;i<=n;i++)
                for(j=w[i];j<=sum;j++)
                    dp[j]=max(dp[j],dp[j-w[i]]+p[i]);
            m+=dp[sum];
        }
        printf("%d\n",m);
    }
    return 0;
}

 

posted @ 2012-08-13 22:59  To be an ACMan  Views(188)  Comments(0)    收藏  举报