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;

}

 

你可能感兴趣的:(HDU)