• hdu-1171 Big Event in HDU


    题目

    hdu-1171
    大意是有n类设备,每类设备的价值相同,要求将所有的设备分成价值尽量相等的两份.

    分析

    这是一个多重背包问题,而背包的容量就是价值的一半

    多重背包的一个解法就是转化为01背包,将背包的数量属性直接反映为m个价值相等的01背包物品

    AC代码

    #include "bits/stdc++.h"
    using namespace std;
    int main(int argc, char const *argv[])
    {
        int n, a[1010], dp[1010], v, i, x, y;
        while(cin >> n && n!=-1){
            int k=0, sum=0;
            for(i = 0; i<n; i++){
                cin >> x >> y;
                while(y--){
                    a[k++] = x;
                    sum+=x;
                }
            }
            int V = sum / 2;
            memset(dp, 0, sizeof(dp));
            for(i=0;i<k;i++){
                for(v=V;v>=a[i];v--){//
                    dp[v] = max(dp[v], dp[v-a[i]]+a[i]);
                }
            }
            cout << sum - dp[V] << ' ' << dp[V] << endl;
        }
        return 0;
    }
    
    
    转载请保留原文链接及作者
    本文标题:
    文章作者: LepeCoder
    发布时间:
    原始链接:
  • 相关阅读:
    背包问题
    阶乘尾数0的个数
    欧拉筛找素数
    威佐夫博弈
    三角形面积
    deleted
    deleted
    deleted
    deleted
    deleted
  • 原文地址:https://www.cnblogs.com/lepeCoder/p/hdu-1171.html
Copyright © 2020-2023  润新知