OJ题目 :http://acm.nyist.net/JudgeOnline/problem.php?pid=325
描述
-
输入
-
多组测试数据(<=1500)。数据以EOF结尾
第一行输入西瓜数量N (1 ≤ N ≤ 20)
第二行有N个数,W1, …, Wn (1 ≤ Wi ≤ 10000)分别代表每个西瓜的重量
输出
- 输出分成两堆后的质量差 样例输入
-
5 5 8 13 27 14
样例输出
-
3
#include <iostream> #include <string> #include <string.h> #include <map> #include <stdio.h> #include <algorithm> #include <queue> #include <vector> #include <math.h> #include <set> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define SWAP(a , b){ int temp = a; a = b; b = temp;} using namespace std; bool dp[200005]; int x[22]; int main() { int m; while(scanf("%d",&m) != EOF) { int sum = 0,ans = 0; for(int i = 0;i < m;i++) { scanf("%d",&x[i]); sum += x[i]; } memset(dp , 0 , (sum + 2)*sizeof(bool)); dp[0] = 1; for(int i = 0;i < m;i++) { for(int j = (sum>>1);j >= x[i];j--) { dp[j] |= dp[j - x[i]]; } } for(int i = (sum>>1);i >= 0;i--) { if(dp[i]) { ans = sum - (i<<1); break; } } printf("%d\n",ans); } return 0; }