描述
相信你已经AC了A + B Problem,是不是很简单呢。
下面继续A and B Problem这个简单的问题,将若干个长度不同的木棍,分成A堆和B堆,并且保证A堆所有木棍的长度之和等于B堆所有木棍的长度之和。
输入
输入数据有多组。
每组测试数据第一行为一个正整数n(n<=100),代表总的木棍个数;
第二行为n个以空格隔开的正整数ci(ci<=100)。
输出
如果n根木棍可以分成两堆木棍(A堆和B堆),并且A堆所有木棍的长度之和等于B堆所有木棍的长度之和,则输出"Yes" ,否则输出"No"(A堆和B堆中的木棍个数不必相等)。
样例输入
4
1 2 3 4
2
1 2
样例输出
Yes
No
解题思路
用深搜索+回溯就可以了
代码
#include<bits/stdc++.h>
using namespace std;
int a[105];
bool vis[105],flog;
int n;
void dfs(int s)
{
if(flog) return;
if(s==0)
{
flog=1;
return;
}
for(int i=0;i<n;i++)
{
if(!vis[i]&&s>=a[i])
{
vis[i]=1;
dfs(s-a[i]);
vis[i]=0;
}
}
}
int main()
{
while(~scanf("%d",&n))
{
int sum=0;
flog=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
///sort(a,a+n);
if(sum%2!=0)
printf("No\n");
else
{
dfs(sum/2);
if(flog)
printf("Yes\n");
else printf("No\n");
}
}
}