完全背包问题定义 & 基本实现
问题:有个容量为V大小的背包,有很多不同重量weight[i](i=1..n)不同价值value[i](i=1..n)的货物,每种物品有无限件可用,想计算一下最多能放多少价值的货物。
与01背包不同的是,完全背包每件物体可以放入无限件(只要能放的下),故对于每件物品i,相当于拆分成了v/c[i]件相同的物品,拆分之后物品i就不是放入或不放入的两种情况了,而是放入0件、放入1件、放入2件…等情况了,对于该件物品i,最大价值取放入k件的最大值,故状态转移方程为:
1
f(i,v) = max{ f(i-1,v-k*c[i]) + k*w[i] | 0<=k<=v/c[i]
}
各状态的意义不再赘述,上代码,关于复杂度以及每种物品的状态数见代码注释:
#include
using namespace std;
int maxV[11][201];
int weight[11];
int value[11];
int V, N;
void main()
{
int i, j, k;
scanf("%d %d",&V,
&N);
for(i = 0; i < N;
++i)
{
scanf("%d
%d",&weight[i],&value[i]);
}
for(i = 0; i < N;
++i)
{
for(j = 0; j <= V; ++j)
{
if(i >
0)
{
maxV[i][j] =
maxV[i-1][j];
if(j/weight[i] >= 1)
{
int max_tmp = 0;
for(k = 1; k <= j/weight[i]; ++k)
{
if(maxV[i-1][j-k*weight[i]] + k*value[i] > max_tmp)
{
max_tmp =
maxV[i-1][j-k*weight[i]] + k*value[i];
}
}
maxV[i][j] = maxV[i][j] > max_tmp ?
maxV[i][j] : max_tmp;
}
}else
{
if(j/weight[0] >= 1)
{
maxV[0][j] = j/weight[0] * value[0];
}
}
}
}
printf("%d",maxV[N-1][V]);
}