分木棍(简单背包)

将若干个长度不同的木棍,分成A堆和B堆,并且保证A堆所有木棍的长度之和等于B堆所有木棍的长度之和。

输入

输入数据有多组。

每组测试数据第一行为一个正整数n(n<=100),代表总的木棍个数;

第二行为n个以空格隔开的正整数ci(ci<=100)。

输出

如果n根木棍可以分成两堆木棍(A堆和B堆),并且A堆所有木棍的长度之和等于B堆所有木棍的长度之和,则输出"Yes" ,否则输出"No"(A堆和B堆中的木棍个数不必相等)。

 

#include<stdio.h>
#include<string.h>
int main()
{
    int a[101],b[10001],n,i,sum,j;
    while(scanf("%d",&n)!=EOF)
    {
        sum=0;
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        if(sum%2) printf("No
");
        else 
        {
            memset(b,0,sizeof(b));
            int f=0;
            for(i=0;i<n;i++)
            {
                for(j=sum/2;j>=a[i];j--)
                if(b[j-a[i]]+a[i]>b[j]) b[j]=b[j-a[i]]+a[i]; //dp简单背包 
            }
            
            for(i=0;i<=sum/2;i++)
            if(b[i]==sum/2) f=1;//检查是否存在 
            if(f) printf("Yes
");
            else printf("No
");
        }
    }
}

 

 

原文地址:https://www.cnblogs.com/mayouyou/p/9159735.html