NYOJ 546(分珠宝)

简介: #include #include #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...
#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;
}                           

  

目录
相关文章
|
6月前
1071 小赌怡情 (15 分)
1071 小赌怡情 (15 分)
L1-044 稳赢 (15 分)
L1-044 稳赢 (15 分)
155 0
L1-044 稳赢 (15 分)
L1-017 到底有多二 (15 分)
L1-017 到底有多二 (15 分)
149 0
L1-018 大笨钟 (10 分)
L1-018 大笨钟 (10 分)
104 0
L1-030 一帮一 (15 分)
L1-030 一帮一 (15 分)
132 0
L1-029 是不是太胖了 (5 分)
L1-029 是不是太胖了 (5 分)
106 0
L1-054 福到了 (15 分)
L1-054 福到了 (15 分)
147 0
L1-043 阅览室 (20 分)
L1-043 阅览室 (20 分)
211 0
R7-9 红色警报 (25 分)
R7-9 红色警报 (25 分)
116 0
7-192 素因子分解 (20 分)
7-192 素因子分解 (20 分)
130 0