NYOJ 546(分珠宝)

#include<stdio.h>
#include<string.h>
#define maxn 100005
int dp[maxn],a[maxn],w[maxn];
int main()
{
    int i,j,num,sum,t,cnt(1);
    while(~scanf("%d%d%d%d%d%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8],&a[9]))
    {
        memset(dp,0,sizeof(dp));
        memset(w,0,sizeof(w));
        sum=0;num=0;
        for(i=0;i<10;i++)
            sum=sum+(i+1)*a[i];//总价值 
        if(sum==0)
            break;//必要 ,因为全输入0并不是ctrl和C组合键 
        if(sum%2==1)
        {        
            printf("#%d:Can't be divided.\n\n",cnt++);
            continue;
        }
        sum=sum/2;
        for(i=0;i<10;i++)
        {
            if(a[i]==0)
            {
                continue;
            }
            t=1;
            while(a[i]-t>0)/*二进制压缩为一般01背包,想想为什么不会是if语句*/
            {
                w[num++]=t*(i+1);
                a[i]=a[i]-t;
                t=t*2;
            }
            w[num++]=a[i]*(i+1);
        }
        for(i=0;i<num;i++)
        {
            for(j=sum;j>=w[i];j--)
            {
                if(dp[j]<dp[j-w[i]]+w[i])
                    dp[j]=dp[j-w[i]]+w[i];
            }
        }
        if(dp[sum]!=sum)
        {
            printf("#%d:Can't be divided.\n\n",cnt++);
        }
        else
        {
            printf("#%d:Can be divided.\n\n",cnt++);
        } 
    }
    return 0;
}                           

  

posted @ 2012-05-30 14:30  加拿大小哥哥  阅读(185)  评论(0编辑  收藏  举报