本文主要是介绍hdu1171 多重背包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
如题:http://acm.hdu.edu.cn/showproblem.php?pid=1171
The splitting is absolutely a big event in HDU! At the same time, it is a trouble thing too. All facilities must go halves. First, all facilities are assessed, and two facilities are thought to be same if they have the same value. It is assumed that there is N (0<N<1000) kinds of facilities (different value, different kinds).
A test case starting with a negative integer terminates input and this test case is not to be processed.
2 10 1 20 1 3 10 1 20 2 30 1 -1
20 10 40 40
这一题用01背包做过,在我博客里。发我自己的写过的另一种方法的博客链接不能通过审阅?
现在多重背包再写一遍!
直接贴代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int w[55];
int num[55];
int f[50*50*100/2+50];
int N;
#define max(a,b)(a>b?a:b)
int main()
{
while(~scanf("%d",&N)&&N>0)
{
int i,j,k,sum1=0;
memset(f,0,sizeof(f));
for(i=1;i<=N;i++)
{
scanf("%d%d",&w[i],&num[i]);
sum1+=w[i]*num[i];
}
int sum=sum1/2;
for(i=1;i<=N;i++)
{
if(num[i]*w[i]>=sum)
{
for(j=w[i];j<=sum;j++)
f[j]=max(f[j],f[j-w[i]]+w[i]);
}
else
{
int cnt=sum;
k=1;
while(k<=cnt)
{
for(j=sum;j>=k*w[i];j--)
f[j]=max(f[j],f[j-k*w[i]]+k*w[i]);
cnt-=k;
k*=2;
}
for(j=sum;j>=cnt*w[i];j--)
f[j]=max(f[j],f[j-cnt*w[i]]+cnt*w[i]);
}
}
printf("%d %d\n",sum1-f[sum],f[sum]);
}
return 0;
}
这篇关于hdu1171 多重背包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!