背包问题_一些代码

学长给的代码:

可作参考

void pack01(int a, int b)	//0 - 1 背包 
{
	int i;
	for(i = Sum; i >= a; i ++)
		dp[i] = maxz(dp[i-a] + b, dp[i]);
}

void packcmp(int a, int b)	//完全背包 
{
	int i ;
	for(i = a; i <= Sum; i ++)
		dp[i] = maxz(dp[i-a] + b, dp[i]);
}

void packmul()			//多重背包 
{
	int i, k;
	for(i = 1; i <= n; i ++)
	{
		if(num[i] * w[i] >= Sum)
		{
			packcmp(w[i], g[i]);
		}
		else
		{
			int k = 1; 
			int amount = num[i];
			while( k < amount)
			{
				pack01(k * w[i], k * g[i]);
				amount -= k;
				k *= 2;
			}
			pack01(amount * w[i], amount * g[i]);
		}
	}
}

posted @ 2013-07-18 18:41  cnwsycf  阅读(277)  评论(0)    收藏  举报