回溯法里的0-1背包

在开始背包问题前我们需要理解回溯法的算法思想

一、回溯法简述:

1.采取深度优先的优先搜索策略     

2.回溯法解题的一个显著特征是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根结点到当前扩展结点的路径。

二、回溯法的算法框架:

1.递归回溯最优子结构性质

2.迭代回溯贪心选择性质

3.子集树算法框架

4.排列数算法框架

三、回溯法的基本思想:

1.定义问题解空间

2.确定易于搜索的解空间结构

3.深度优先搜索解空间,采取剪枝函数排除无效搜索。

剪枝函数:利用约束函数在扩展结点剪掉不满足约束的字数,限界函数减去得不到最优解的子树。

0-1背包问题:

给定3种物品和一个背包。物品i的重量分别是W={16,15,15},其价值分别为P={45,25,25},背包的容量为C=30。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

问题分析

在选择装入背包的物品时,每种物品只有两种选择选(1)或不选(0),不能将物品装入背包多次,也不存在装入部分的情况。

深度遍历

简单算法实现如下:

传入物品价值cp,物品重量cw,w[]记录i物体的重量,v[]记录i物品的价值

int rpack(int i,int n,int cw,int cp, float *w, float *p) {
	int b;//背包现在价值
	float cleft = c - cw;//背包剩余容量
	b = cp;
	while (i <= n && w[i] <= cleft) {
		cleft = cleft - w[i];
		b += p[i];
		i++;
	}
//装满背包
	if (i <= n)b = b + p[i] / w[i] * cleft;
	return b;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值