1. 程式人生 > >hdu——1171(01揹包)

hdu——1171(01揹包)

題目連結:

【分析】

把題目轉化為01揹包

兩個相近的的話

就是接近於總長的1/2

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<cmath>
using namespace std;
#define maxn 1000010
int a[maxn],b[maxn];
int dp[maxn];
bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
    int n;
    while(cin>>n&&n>0)
    {
        int sum=0;
        memset(dp,0,sizeof(dp));
        memset(a,0,sizeof(a));
        int cnt=0;
        while(n--)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            sum+=x*y;
            while(y--)
            {
                a[cnt++]=x;
            }
        }
        sort(a,a+cnt,cmp);
        for(int i=0;i<cnt;i++)
        {
            for(int j=sum/2;j>=a[i];j--)
            {
                dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
            }
        }
        printf("%d %d\n",sum-dp[sum/2],dp[sum/2]);
    }
    return 0;
}