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;
}
posted on 2012-04-30 16:47  Staginner  阅读(322)  评论(0编辑  收藏  举报