#include <iostream>
using namespace std;
int f[1000];
const int N = 5;//物品的种类
int volume[N];//每种物品所占有的空间
int val[N];//每种物品的价值
int maxVol;
void MultiplePack(int volm,int val,int count)//第i种物品的数量为count;
{
if(volm * count >=maxVol)
{
CompletePack(volm,val);
return;
}
int k = 1;
while (k<count)//将count个的第i物品分成n份,每份的数量按照1,2^1,2^2,2^3,...,count - 2^i +1,如此将每份都看成不同的物品,份数相加能表示任何小于等于count的整数
{
ZeroOnePack(k*volm,k*val);
count = count - k;
k = 2*k;
}
ZeroOnePack(count*volm,count*val);
}
void ZeroOnePack(int volm,int val)//设此次处理的是第i中物品,则此函数求出的是在每种容量下,从第0到第i种物品的最优组合,使其价值最高(已知从第0到第i-1的最优组合,此函数的作用只是对每一种容量下判断是否添加第i中物品)
{
for (int v = maxVol;v>=volm;--v)
{
f[v] = max(f[v],f[v-volm] + val);//max括号里面的f都是指在从第0到第i-1种物品最优组合。当处理第一个物品时,因为f被初始化为0,所以这一步也等价于初始化f,即在小于等于maxVol的情况下,最大值都是第一个物品的价值
}
}
void CompletePack(int volm,int val)//不管在v-volm容量下是否已经添加第i种物品了,这个函数只需判断是v-volm容量下添加第i种物品的价值和在v容量下从第0到第i-1物品的价值
{
for (int v=volm;v<=maxVol;++v)
{
f[v] = max(f[v],f[v-volm] + val);
}
}
int main()
{
memset(f,0,sizeof(f));
for (int i = 0;i<N;++i)
{
ZeroOnePack(volume[i],val[i]);
}
return 0;
}
背包问题代码
最新推荐文章于 2024-03-31 11:50:51 发布