hdu1171(01背包问题)

将总值分为2就是01背包问题了


可以作为01背包问题模板


//

//  main.cpp

//  6.5

//

//  Created by Mr.Xue on 17/7/17.

//  Copyright © 2017 Mr.Xue. All rights reserved.

//


#include

#include

#include

#include

using namespace std;

int dp[300000],l[5005];

int max(int a,int b)

{

    return a>b?a:b;

}

int main()

{

    int t,sum,k;

    while(scanf("%d",&t)&&t>0)

    {

        sum=0;

        memset(dp,0,sizeof(dp));

        memset(l,0,sizeof(l));

        int a,b;

        k=0;

        for(int i=0;i

        {

            scanf("%d %d",&a,&b);

            while(b--)

            {

                l[k++]=a;

                sum+=a;

            }

        }

        for(int i=0;i

        {

            for(int j=sum/2;j>=l[i];j--)

                dp[j]=max(dp[j],dp[j-l[i]]+l[i]);

        }

        printf("%d %d\n",sum-dp[sum/2],dp[sum/2]);

    }

    return 0;

}



你可能感兴趣的:(01背包问题)