码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 562 Dividing coins

时间:2015-05-01 14:40:58      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:

题意:

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

思路:

算出硬币总和,然后把硬币总和的一半设为背包容量,背包能拿到的最大价值即是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;
}

 

UVa 562 Dividing coins

标签:

原文地址:http://www.cnblogs.com/ohxiaobai/p/4414641.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!