HDU 1171 Big Event in HDU(가방 01)

968 단어
제목: 모든 물체의 가치와 물체의 수량을 제시하고 A, B가 얻는 가치가 가장 가깝고 A의 가치가 B보다 작으면 안 된다는 것을 제시한다.
사고방식: 합계를 똑같이 나누면 01배낭 문제가 나온다.
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxm=1e6+10;
int dp[maxm<<2];
int v[maxm];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF&&n>0)
    {
        memset(dp,0,sizeof(dp));
        memset(v,0,sizeof(v));
        int a,b;
        int l=0,sum=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&a,&b);
            while(b--)
            {
                v[l++]=a;
                sum+=a;//   
            }
        }
        for(int i=0;i<l;i++)
        {
            for(int j=sum/2;j>=v[i];j--)
            {
                dp[j]=max(dp[j],dp[j-v[i]]+v[i]);//01  
            }
        }
        printf("%d %d
",sum-dp[sum/2],dp[sum/2]); } return 0; }

좋은 웹페이지 즐겨찾기