将若干个长度不同的木棍,分成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 "); } } }