UVA 562 Dividing coins (01背包)

题意:给你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
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/chenxiwenruo/p/3459605.html