hdu 1171 Big Event in HDU(多重背包可行性)

来源:互联网 发布:淘宝取现手续费多少 编辑:程序博客网 时间:2024/05/22 10:31

总价值的一半为背包容量,可以多重背包,可以转成完全背包

#include <bits/stdc++.h>using namespace std;const int MAXN = 10000;int num[MAXN];int dp[MAXN*100];int v[MAXN];int n,sum,W;int main(){    ios::sync_with_stdio(false);    while(cin >> n && n > 0)    {        sum = 0;        memset(dp,0,sizeof(dp));        for(int i = 0; i < n; ++i)        {            cin >> v[i] >> num[i];            sum += v[i]*num[i];        }        W = sum/2;        int res = 0;        for(int i = 0; i < n; ++i)        {            if(v[i]*num[i] >= W)            {                for(int j = v[i]; j <= W; ++j)                {                    dp[j] = max(dp[j],dp[j-v[i]]+v[i]);                    res = max(res,dp[j]);                }            }            else            {                int temp = num[i];                for(int k = 1; k <= num[i]; k *= 2)                {                    for(int j = W; j >= k*v[i]; --j)                    {                        dp[j] = max(dp[j],dp[j-k*v[i]]+k*v[i]);                        res = max(dp[j],res);                    }                    temp -= k;                }                if(temp)                {                    for(int j = W; j >= temp*v[i]; --j)                    {                        dp[j] = max(dp[j],dp[j-temp*v[i]]+temp*v[i]);                        res = max(dp[j],res);                    }                }            }        }        cout << max(res,sum-res) << " " << min(res,sum-res) << endl;    }    return 0;}