将若干个长度不同的木棍,分成A堆和B堆,并且保证A堆所有木棍的长度之和等于B堆所有木棍的长度之和。
输入
输入数据有多组。
每组测试数据第一行为一个正整数n(n<=100),代表总的木棍个数;
第二行为n个以空格隔开的正整数ci(ci<=100)。
输出
如果n根木棍可以分成两堆木棍(A堆和B堆),并且A堆所有木棍的长度之和等于B堆所有木棍的长度之和,则输出"Yes" ,否则输出"No"(A堆和B堆中的木棍个数不必相等)。
#include#include int main(){ int a[101],b[10001],n,i,sum,j; while(scanf("%d",&n)!=EOF) { sum=0; for(i=0;i =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\n"); else printf("No\n"); } }}