hdu 1059 多重背包 背包指数分块

思路:

这个方法要看《浅谈几类背包问题》这篇论文。

#include"stdio.h"
#define Max(a,b) (a)>(b)?(a):(b)
int f[31],k[8];
int main()
{
    int i,j,m,Case=0;
    while(scanf("%d%d%d%d%d%d",&k[1],&k[2],&k[3],&k[4],&k[5],&k[6])!=EOF,k[1]|k[2]|k[3]|k[4]|k[5]|k[6])
    {
        for(i=0;i<=30;i++)
            f[i]=0;
        int sum=k[1]+k[2]*2+k[3]*3+k[4]*4+k[5]*5+k[6]*6;
        sum%=60;
        int c=sum/2;
        if(sum%2!=0)
        {
            printf("Collection #%d:\nCan't be divided.\n\n",++Case);
            continue;
        }
        for(i=1;i<=6;i++)
        {
            m=1;
            if(k[i]==0) continue;
            while(k[i]>0)
            {
                if(k[i]<m)
                    m=k[i];
                k[i]-=m;
                for(j=c;j>=m*i;j--)
                {
                    f[j]=Max(f[j],f[j-m*i]+i*m);
                }
                m*=2;
            }
        }
        if(f[c]==c)
            printf("Collection #%d:\nCan be divided.\n\n", ++Case);
        else
            printf("Collection #%d:\nCan't be divided.\n\n",++Case);
    }
    return 0;
}

 

posted @ 2013-08-02 20:51  fangguo  阅读(222)  评论(0编辑  收藏  举报