您的位置:首页 > 其它

UVa 562 - Dividing coins

2016-04-05 19:00 369 查看
题意:
若干硬币,分成两份,使其绝对值之差尽量小。

思路:

算出硬币总和,然后把硬币总和的一半设为背包容量,背包能拿到的最大价值即是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: