HDU 1171 Big Event in HDU(多重背包)

来源:互联网 发布:excel怎么数据透视 编辑:程序博客网 时间:2024/04/29 08:44
f[j]=max(f[j],f[j-k*v[i]]+k*v[i])。内层循环时逆序。
////  main.cpp//  Richard////  Created by 邵金杰 on 16/9/10.//  Copyright © 2016年 邵金杰. All rights reserved.//#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=255555;int f[maxn],v[maxn],c[maxn];int main(){    int n;    while(scanf("%d",&n)&&n>0)    {        memset(f,0,sizeof(f));        int sum=0;        for(int i=0;i<n;i++)        {            scanf("%d%d",&v[i],&c[i]);            sum+=v[i]*c[i];        }        for(int i=0;i<n;i++)        {            int l=c[i],k=1;            while(l>k)            {                for(int j=sum/2;j>=k*v[i];j--)                    f[j]=max(f[j],f[j-k*v[i]]+k*v[i]);                l-=k;                k<<=1;            }            for(int j=sum/2;j>l*v[i];j--)                f[j]=max(f[j],f[j-l*v[i]]+l*v[i]);        }        cout<<sum-f[sum/2]<<" "<<f[sum/2]<<endl;    }    return 0;}

0 0
原创粉丝点击