UVa 562 - Dividing coins

题意:

若干硬币,分成两份,使其绝对值之差尽量小。

思路:

算出硬币总和,然后把硬币总和的一半设为背包容量,背包能拿到的最大价值即是2个人中其中一个所得到。

然后用01背包的思路。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int Max(int a,int b){
    if(a > b)return a;
    return b;
}
int main()
{
    #ifndef ONLINE_JUDGE
        freopen("D:\\acm.txt","r",stdin);
    #endif // ONLINE_JUDGE
    int cases,ans;
    int bags[50010];
    int coinNum,coins[200];
    cin >> cases;
    while(cases--){
        memset(bags,0,sizeof(bags));
        memset(coins,0,sizeof(coins));
        ans = 0;
        int coinSum = 0;
        
        ///////////////////
        cin>>coinNum;
        for(int i = 0;i < coinNum;i++) {
            cin >> coins[i];
            coinSum += coins[i];
        }
        int half = coinSum / 2;//背包容量设成钱币总数的一半
        /////////////
        
        for(int i = 0;i < coinNum;i++){
            for(int j = half  ;j >= coins[i];j--){
                bags[j] = Max(bags[j] , bags[j - coins[i]] + coins[i]);
            }//01背包
        }
        ///////////
        
        if(bags[half] > half)ans = bags[half] - (coinSum - bags[half]);
        else ans = (coinSum  - bags[half]) - bags[half];

        cout << ans<<endl;
    }
    return 0;
}

 

posted @ 2015-05-01 13:50  小白v  阅读(121)  评论(0编辑  收藏  举报