当前位置:   article > 正文

回溯法里的0-1背包_用回溯法求解0-1背包问题,假如3件物品(按照价值密度排序)的重量与价值分别是:

用回溯法求解0-1背包问题,假如3件物品(按照价值密度排序)的重量与价值分别是:

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

一、回溯法简述:

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物品的价值

  1. int rpack(int i,int n,int cw,int cp, float *w, float *p) {
  2. int b;//背包现在价值
  3. float cleft = c - cw;//背包剩余容量
  4. b = cp;
  5. while (i <= n && w[i] <= cleft) {
  6. cleft = cleft - w[i];
  7. b += p[i];
  8. i++;
  9. }
  10. //装满背包
  11. if (i <= n)b = b + p[i] / w[i] * cleft;
  12. return b;
  13. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/333048
推荐阅读
相关标签
  

闽ICP备14008679号