A.3583
n根木棍是否能分成相等两堆。
背包dp,首先求和sum,如果为偶数就说明不行,否则考虑做一个sum/2大小的背包。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main() 5 { 6 int n,w[105]; 7 while(scanf("%d",&n)!=EOF) 8 { 9 int sum=0; 10 for(int i=1;i<=n;i++)scanf("%d",&w[i]),sum+=w[i]; 11 bool dp[10005]; 12 memset(dp,0,sizeof dp); 13 dp[0]=1; 14 for(int i=1;i<=n;i++) 15 for(int j=sum/2;j>=w[i];j--) 16 dp[j]=dp[j]|dp[j-w[i]]; 17 printf("%s\n",dp[sum/2]&&sum%2==0?"Yes":"No"); 18 } 19 return 0; 20 }