您的位置:首页 > 其它

UVA 562 Dividing coins (01背包)

2013-12-05 15:12 351 查看
题意:给你n个硬币,和n个硬币的面值。要求尽可能地平均分配成A,B两份,使得A,B之间的差最小,输出其绝对值。
思路:将n个硬币的总价值累加得到sum,
   A,B其中必有一人获得的钱小于等于sum/2,另一人获得的钱大于等于sum/2。
   因此用sum/2作为背包容量对n个硬币做01背包处理,
   所能得到的最大容量即为其中一人获得的钱数。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxv=100*250+5;
const int maxn=105;
int dp[maxv];
int w[maxn];
int n,m,v;
int sum;
int main()
{
scanf("%d",&n);
while(n--){
scanf("%d",&m);
sum=0;
for(int i=1;i<=m;i++){
scanf("%d",&w[i]);
sum+=w[i];
}
v=sum/2;
memset(dp,0,sizeof(dp));
for(int i=1;i<=m;i++){
for(int j=v;j>=w[i];j--){
dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
}
}
int ans=abs(sum-dp[v]-dp[v]);
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: