多重背包模板 C++

多重背包模板

 

 多重背包:

  1.         有N种物品和一个容量为V的背包。第i种物品最多有numi件可用。
  2.          每件物品的重量是wi,价值是vi。
  3.          求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。

 

const int maxn = 100005;
int w[maxn], v[maxn], num[maxn];//w:重量 v:价值 num:数量 // w: weight, v:value, num:number
int dp[maxn];           
int V;               //V:容量
 
//01背包
void ZeroOnePack(int w, int v)
{
	for (int j = V; j >= w; j--)
	{
		dp[j] = max(dp[j], dp[j - w] + v);
	}
}
//完全背包
void CompletePack(int w, int v)
{
	for (int j = w; j <= V; j++)
	{
		dp[j] = max(dp[j], dp[j - w] + v);
	}
}
//多重背包
void MultiplePack(int w, int v, int num)
{
	if (w * num >= V)
	{
		CompletePack(w, v);
	}
	else
	{
		int k = 1;
		while (k < num)
		{
			ZeroOnePack(k*w, k*v);
			num -= k;
			k <<= 1;
		}
		ZeroOnePack(num*w, num*v);
	}
}

 

例题

Cash Machine

POJ - 1276

 

思路:

多重背包裸题

直接套用模板

这里注意的是物品的价值value等于其重量weight,即v[i] = w[i]

 

C++代码如下:

/**
// 多重背包:

//         有N种物品和一个容量为V的背包。第i种物品最多有numi件可用。
//         每件物品的重量是wi,价值是vi。
//         求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。
*/
#include 
#include 
#include 
#include 
using namespace std;

const int maxn = 100005;
int w[maxn], v[maxn], num[maxn];//w:重量 v:价值 num:数量 // w: weight, v:value, num:number
int dp[maxn];           
int V;               //V:容量
 
//01背包
void ZeroOnePack(int w, int v)
{
	for (int j = V; j >= w; j--)
	{
		dp[j] = max(dp[j], dp[j - w] + v);
	}
}
//完全背包
void CompletePack(int w, int v)
{
	for (int j = w; j <= V; j++)
	{
		dp[j] = max(dp[j], dp[j - w] + v);
	}
}
//多重背包
void MultiplePack(int w, int v, int num)
{
	if (w * num >= V)
	{
		CompletePack(w, v);
	}
	else
	{
		int k = 1;
		while (k < num)
		{
			ZeroOnePack(k*w, k*v);
			num -= k;
			k <<= 1;
		}
		ZeroOnePack(num*w, num*v);
	}
}
int main()
{
	while (scanf("%d", &V) != EOF)
	{
		int n; scanf("%d", &n);
		for (int i = 1; i <= n; i++)
		{
			scanf("%d%d", &num[i], &w[i]);
			v[i] = w[i];
		}
		memset(dp, 0, sizeof(dp));
		for (int i = 1; i <= n; i++)
			MultiplePack(w[i], v[i], num[i]);
		printf("%d\n", dp[V]);
	}
	return 0;
}

 

你可能感兴趣的:(POJ,DP)