0-1背包Big Event in HDU

来源:互联网 发布:python 执行adb shell 编辑:程序博客网 时间:2024/04/30 02:17


Big Event in HDU

http://acm.hdu.edu.cn/showproblem.php?pid=1171

#include<stdio.h>
#include<string.h>
int max(int x,int y)
{
    return x>y ? x:y;
}
int e[50000],dp[50000];
int main()
{
    int a,b,c,sum,i,j,l;
    while(scanf("%d",&a),a>=0)
    {
        memset(dp,0,sizeof(dp));
        sum=0;
        l=0;
        for(i=0;i<a;i++)
        {
            scanf("%d%d",&b,&c);
            sum+=b*c;
            while(c--)
                e[l++]=b;
        }
        for(i=0;i<l;i++)
            for(j=sum/2;j>=e[i];j--)
                dp[j]=max(dp[j],dp[j-e[i]]+e[i]);
        printf("%d %d\n",sum-dp[sum/2],dp[sum/2]);
    }

    return 0;
}

 

多重背包

#include<iostream>
#include<string>
using namespace std;
int dp[300000],a[55],num[55];
int max(int x,int y)
{
 return x>y?x:y;
}
int main()
{
 int i,j,k,n;
 while(cin>>n,n>=0)
 {
  int sum=0;
  for(i=1;i<=n;i++)
  {
   cin>>a[i]>>num[i];
   sum+=a[i]*num[i];
  }
  memset(dp,0,sizeof(dp));
  for(i=1;i<=n;i++)
   for(j=1;j<=num[i];j++)
    for(k=sum/2;k>=a[i];k--)
     dp[k]=max(dp[k],dp[k-a[i]]+a[i]);
  cout<<sum-dp[sum/2]<<" "<<dp[sum/2]<<endl;
 }
 return 0;
}

0 0
原创粉丝点击