A and B Problem

Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte
Total Submit: 25 Accepted: 16
Total Submit: 25 Accepted: 16
Description
相信你已经AC了A + B Problem,是不是很简单呢。
下面继续A and B Problem这个简单的问题,将若干个长度不同的木棍,分成A堆和B堆,并且保证A堆所有木棍的长度之和等于B堆所有木棍的长度之和。
Input
输入数据有多组。
每组测试数据第一行为一个正整数n(n<=100),代表总的木棍个数;
第二行为n个以空格隔开的正整数ci(ci<=100)。
Output
如果n根木棍可以分成两堆木棍(A堆和B堆),并且A堆所有木棍的长度之和等于B堆所有木棍的长度之和,则输出"Yes" ,否则输出"No"(A堆和B堆中的木棍个数不必相等)。
Sample Input
4
1 2 3 4
2
1 2
Sample Output
Yes
No
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int maxn = 110; bool vis[maxn]; vector<int> v; int n, sum; bool result; bool cmp(const int& x, const int& y) { return x < y; } void dp(int s) { if(result) return; if(s == 0) { result = true; return; } int i, Size = v.size(); for(i = Size-1; i >= 0; i--) { if(!vis[i] && s >= v[i]) { vis[i] = true; dp(s-v[i]);//状态转移. vis[i] = false; } } } void init() { sum = 0; v.clear(); result = false; memset(vis, false, sizeof(vis)); } int main() { int i; int tmp; while(scanf("%d", &n) != EOF) { init(); for(i = 1; i <= n; i++) { scanf("%d", &tmp); sum += tmp; v.push_back(tmp); } sort(v.begin(), v.end(), cmp); if(sum % 2 == 1) { printf("No\n"); continue; } dp(sum/2); if(result) printf("Yes\n"); else printf("No\n"); } return 0; }