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;
}

posted @ 2017-08-30 17:38  lepeCoder  阅读(224)  评论(0编辑  收藏  举报