zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    spark 脚本示例
    R树的应用
    将博客搬至CSDN
    select
    注册页面的验证码的实现
    web项目.注册及登陆
    eclipse web 项目中遇到的问题总结
    Apache与Tomcat
    关于MVC整理
    JDBC
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/3459605.html
Copyright © 2011-2022 走看看