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

题目地址:点击打开链接

思路:给软件学院和计算机学院分2个背包,每个背包的容量是所有设备的一半,让软件学院的先拿,剩下的拿不了的归计算机学院,一次写完,直接AC,有点小激动啊

AC代码:

#include<stdio.h>
#include<string.h>

int v[110],m[110],dp[200000];
int n,sum;

int max(int a,int b)
{
	return a > b ? a : b;
}

void zeroone_pack(int value)
{
	int i;
	for(i=sum; i>=value; i--)
	{
		dp[i] = max(dp[i],dp[i-value] + value);
	}
}

void complete_pack(int value)
{
	int i;
	for(i=value; i<=sum; i++)
	{
		dp[i] = max(dp[i],dp[i-value] + value);
	}
}

void multi_pack()
{
	int i,count,k;
	for(i=0; i<n; i++)
	{
		if(v[i] * m[i] >= sum)
		{
			complete_pack(v[i]);
		}
		else//转化为01背包
		{
			k = 1;
			count = m[i];
			while(k < count)
			{
				zeroone_pack(k*v[i]);
				count -= k;
				k *= 2;
			}
			zeroone_pack(count*v[i]);
		}
	}
}

int main()
{
	int i,sum2;
	while(scanf("%d",&n) && n >0)
	{
	    sum = 0;
		memset(dp,0,sizeof(v));
		for(i=0; i<n; i++)
		{
			scanf("%d%d",&v[i],&m[i]);
			sum += v[i] * m[i];
		}
		sum2 = sum;
		sum /= 2;
		multi_pack();
		printf("%d %d\n",sum2-dp[sum],dp[sum]);
	}
	return 0;
}



你可能感兴趣的:(HDU 1171 Big Event in HDU(多重背包))