poj 2063 Investment 完全背包

#include <stdio.h>
#include <math.h>
#include <string.h>
int max(int a,int b)
{
    return a>b?a:b;
}
int f[50001];    //每次增长以最大1.1倍计算,范围是(1.1)^40*1000000/1000
int c[11],w[11];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int i,j,k,m,n,p,t;
        scanf("%d%d%d",&m,&p,&n);
        for(i=0;i<n;i++)
            scanf("%d%d",&c[i],&w[i]);
        for(k=0;k<p;k++)
        {
            memset(f,0,sizeof(f));
            t=m/1000;     //投资时1000的倍数,因而可以进行m/1000,减少时间和空间消耗
            for(i=0;i<n;i++)
            {
                for(j=c[i]/1000;j<=t;j++)
                    f[j]=max(f[j],f[j-c[i]/1000]+w[i]);
            }
            m+=f[t];
        }
        printf("%d\n",m);
    }
    return 0;
}

如果不进行/1000处理就会超时和超空间;

题目中说过每次债卷都是几千,因而可以进行/1000压缩空间需求

你可能感兴趣的:(完全背包)