zoukankan      html  css  js  c++  java
  • UVA.562 Dividing coins (DP 01背包)

    UVA.562 Dividing coins (DP)

    题意分析

    给出一堆不同面额的硬币,要求将这这些硬币分为价值接近的2堆(越接近越好,相等的情况最佳,且单个硬币不可再分),并最后输出这2堆硬币价值差值的绝对值。

    先累加求出这堆硬币的总和sum,然后令sum/2为背包容量,所有硬币为商品做01背包即可。最后求出的解为其中一堆最多能分多少价值的硬币(设为x),那么另一堆硬币的价值为sum-x,故两堆硬币的差值为sum-x*2。

    核心状态转移方程:
    dp[i][j] = max(dp[i][j],dp[i-1][j-a[i]]+a[i])

    代码总览

    /*
        Title:UVA.562
        Author:pengwill
        Date:2017-2-16
    */
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define nmax 105
    #define mc 50000
    using namespace std;
    int a[nmax],dp[nmax][mc];
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--){
            int n,c = 0;
            scanf("%d",&n);
            memset(dp,0,sizeof(dp));
            memset(a,0,sizeof(a));
            for(int i = 1; i<=n; ++i) {scanf("%d",&a[i]); c+=a[i];}
            for(int i =1; i<=n;++i){
                for(int j = 0;j<=c/2;++j){
                    dp[i][j] = dp[i-1][j];
                    if(j>=a[i])
                        dp[i][j] = max(dp[i][j],dp[i-1][j-a[i]]+a[i]);
                }
            }
            printf("%d
    ",c-2*dp[n][c/2]);
        }
        return 0;
    }
  • 相关阅读:
    Charles 环境安装
    postman的安装指南
    python-web自动化-三种等待方式(元素定位不到一)
    如何查找MySQL中查询慢的SQL语句
    1023 组个最小数
    linux学习笔记01
    P6461 [COCI2006-2007#5] TRIK
    P1181 数列分段Section I
    P4414 [COCI2006-2007#2] ABC
    如何安装oracle
  • 原文地址:https://www.cnblogs.com/pengwill/p/7367159.html
Copyright © 2011-2022 走看看