背包问题代码

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值