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 }
A.cpp

相关文章: