1. 程式人生 > >分木棍(簡單背包)

分木棍(簡單背包)

sizeof -s rom 存在 std ott nbsp roman i++

將若幹個長度不同的木棍,分成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\n"); 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\n"); else printf("
No\n"); } } }

分木棍(簡單背包)