首页 > 代码库 > 分辣条-01背包恰好装满情况

分辣条-01背包恰好装满情况

分辣条

发布时间: 2016年6月26日 20:36   最后更新: 2016年6月26日 20:37   时间限制: 1000ms   内存限制: 128M

“你喝的酸奶是我买的,辣条也是我买的,你现在要跟我分手,你把我当什么?”

“因为你每次分辣条的时候都比我多一根!”

可见分好辣条是一件多么重要的事情。。

现在有n(1<=n<=200)根辣条,每根辣条的重量为a1,a2...ai..an(1<=ai<=100)。

那么能不能把这些辣条分为重量相等的两份呢?

输入有多组数据。
每组数据第一行为一个整数n(1<=n<=200),n代表辣条的数量。
第二行有n个整数,a1,a2...ai..an,其中ai(1<=ai<=100)代表第i根辣条的重量

若能分成重量相等的两份,则输出"YES",否则输出"NO"每个答案占一行

 复制
3
1 2 1
4
1 1 1 2
YES
NO

01背包解决恰好装满情况,利用容积与价值相等。

#include<stdio.h>
#include<string.h>
int main()
{
    int n,sum,i,j;
    int a[205],f[20005];
    while(~scanf("%d",&n)){
        sum=0;
        for(i=1;i<=n;i++){
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        if(sum%2==1) printf("NO\n");
        else{
            sum/=2;
            memset(f,0,sizeof(f));
            for(i=1;i<=n;i++){
                for(j=sum;j>=0;j--){
                    if(j-a[i]>=0){
                        if(f[j-a[i]]+a[i]>f[j]) f[j]=f[j-a[i]]+a[i];
                    }
                }
            }
            if(f[sum]==sum) printf("YES\n");
            else printf("NO\n");
        }
    }
    return 0;
}  

 

分辣条-01背包恰好装满情况