多重背包——POJ 1276

POJ 1276 Cash Machine

/*
poj 1276
多重背包题目,cost 与 value 是同一个
*/

#include <iostream>
using namespace std;

int inline Max(int a,int b)
{
	if(a>b)
		return a;
	return b;
}

int W[12],V[12],dp[100010];

int main()
{
	int n,i,j,k,cash,amount;
	while(cin>>cash>>n)
	{
		for(i=0;i<100010;i++)
			dp[i]=0;

		for(i=0;i<n;i++)
		{
			cin>>W[i]>>V[i];
			dp[ V[i] ] = V[i]; 
		}
		for(i=0;i<n;i++)
		{
			if(W[i]*V[i]>=cash)
			{
				//完全背包
				for(j=V[i];j<=cash;j++)
					dp[j] = Max(dp[j] , dp[j-V[i]] + V[i]);
			}
			else
			{
				//多重背包
				k=1;
				amount = W[i];
				while(k < amount)
				{
					for(j=cash;j >= k*V[i];j--)
						dp[j] = Max(dp[j] , dp[j - k*V[i]]+k*V[i]);
					amount -= k;
					k *= 2;
				}
				if(amount > 0)
				{
					for(j=cash ; j >= amount*V[i] ;j--)
					{
						//amount 现在是分解为k^2之后剩下的
						dp[j] = Max(dp[j] , dp[j-amount*V[i]]+amount*V[i]);
					}
				}
			}
		}
		cout<<dp[cash]<<endl;
	}
	return 0;
}


你可能感兴趣的:(ini)