HDU 1171 Big Event in HDU(01背包)

题目链接

题意:给出n个物品的价值v,每个物品有m个,设总价值为sum,求a,b。a+b=sum,且a尽可能接近b,a>=b。

题解:01背包。

#include <bits/stdc++.h>
using namespace std;
int data[5050],dp[125050],n,v,m;
int main()
{
    while(scanf("%d",&n)&&n>0)
    {
        memset(dp,0,sizeof(dp));
        int sum=0,cnt=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&v,&m);
            sum+=v*m;
            while(m--) data[cnt++]=v;
        }
        int k=sum/2;
        for(int i=0;i<cnt;i++)//注意不是n
        for(int j=k;j>=data[i];j--)
        dp[j]=max(dp[j],dp[j-data[i]]+data[i]);
        printf("%d %d\n",sum-dp[k],dp[k]);
    }
    return 0;
}

 

posted @ 2017-12-18 19:11  Ritchie丶  阅读(170)  评论(0编辑  收藏  举报