URAL_1005
由于石头的数量很少但重量的区间跨度比较大,所以不妨直接暴力。
#include<stdio.h> #include<string.h> #include<stdlib.h> #define MAXD 30 int N, a[MAXD], ans, A[MAXD], S; int cmp(const void *_p, const void *_q) { int *p = (int *)_p, *q = (int *)_q; return *p < *q ? 1 : -1; } void init() { int i, j, k; for(i = 0; i < N; i ++) scanf("%d", &a[i]); qsort(a, N, sizeof(a[0]), cmp); A[N] = 0; for(i = N - 1; i >= 0; i --) A[i] = A[i + 1] + a[i]; } void dfs(int cur, int num) { if(cur == N) { if(num > ans) ans = num; } if(A[cur] + num <= ans) return ; if(num + a[cur] <= S) dfs(cur + 1, num + a[cur]); dfs(cur + 1, num); } void solve() { S = A[0] / 2; ans = 0; dfs(0, 0); printf("%d\n", A[0] - 2 * ans); } int main() { while(scanf("%d", &N) == 1) { init(); solve(); } return 0; }