求助:队列分支法解0/1背包问题

proof1 proof1 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
教材上的程序,实验没有通过,请帮忙改一下,哪出错了?
----------------------------------------------------------

【例9】FIFO分支法解决0/1背包问题。
  数据结构设计:在回溯算法的辅助空间参数栈中,对高度为n的树,最多有n个数据,即依次存储树中一个分支各层结点的信息。而在分支法算法的辅助空间队中的结点,就无法识别结点间的层次等关系。所以队列中的数据要涵盖结点的所有信息。
  (1)i是结点所在层次,表示处理的是第i件物品。
  (2)变量flag存储物品的取舍情况,flag为1表示选取该物品,flag为0表示不选取该物品。
  (3)当前的利润cp和重量cw。
  (4)为了能方便输出最大利润的方案,用线性的数组队,每次扩展都记录活结点的父结点下标par。同时记录当前最大利润的最后一个物品的编号bestq。

----------------------------------------------------------
#include <iostream>
#include <iomanip>
using namespace std;

struct DEF_node {
int i,flag,par;
float cp,cw;
};

int w[]={0,1,2,3,4,5}; //重量
int p[]={0,3,9,2,5,7}; //价值
int n=5; //物品个数
int m=8; //背包容量
void algm(int,int);

main() {
algm(n,m);
}

struct DEF_node enode,node,q[100]; //enode为当前扩展结点,node为 enode的子结点
void algm(int n,int m) {
int f=0,e=0; //队首、队尾指针
int bestp=0,beste=0;
enode.cw=0; //初始化第1层
enode.cp=0;
enode.i=0;
enode.flag=0;
enode.par=0;
e++;
q[e]=enode;

while (e!=0) { //e=0子集空间树搜索完毕
node.cw=enode.cw+w[enode.i+1];
if (node.cw<=m) { //检查左孩子。可行的左孩子,取物品i
node.cp=enode.cp+p[enode.i+1];
if (node.cp>bestp) {
bestp=node.cp;
beste=e+1;
}
node.flag=1;
node.par=f;
node.i=enode.i+1;
e++;
q[e]=node;
}

node.cw=enode.cw; //搜索右孩子,不取物品i
node.cp=enode.cp;
node.flag=0;
node.par=f;
node.i=enode.i+1;
e++;
q[e]=node;

f++; //取下一个E-结点
enode=q[f];
}


for (int j=1; j>=n; j++) { //输出最大利润方案之一
if (q[beste].flag==1)
cout<<"choose"<<q[beste].i<<" ";
beste=q[beste].par;
}
cout<<"Max="<<bestp<<endl;
}


感觉第32行很吊诡,因为循环体内e没有减小操作,没有满足循环终止条件e=0的可能。可是书上就是这么印的。是不是哪里有印刷错误?改了半天也没成功。
必须FIFO队列式分支法,不要“优先”队列式分支限界法。
请帮忙给修正、调试一下。
...全文

相关推荐

0/1背包问题(蛮力、动态规划、回溯、分支限界法)

算法设计实验报告,包括:蛮力、动态规划、回溯、分支限界四种算法求解0/1背包问题的基本思想、时间复杂度分析,C++实现代码,运行结果截图,实验心得。

XACKWXl

436-分支限界算法-0-1背包问题(两种队列实现)

分支限界算法解决0-1背包问题-FIFO队列 相当于左子树加约束条件了,右子树限界。 我们把根节点描述成nullptr //分支限界算法 - 01背包问题 FIFO队列 int w[] = { 16,15,15 };//物品的重量 int v[] = { 45, 25, 25 };//物品的价值 int c = 30;//背包的容量 const int n = sizeof(w) / sizeof(w[0]);//物品的个数 int cw = 0;//已选择物品的重量 int cv = 0;//

林林林ZEYU

利用优先队列式分支限界法解决0-1背包问题

问题描述: 给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包最大承载重量为C。物品是不可分割的,应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 要求: 随机生成物品和背包数据,利用分支限界法求解该问题并形成解题报告。 一、问题分析: 0-1背包问题用优先队列式分支限界法实现时, ①问题有2^n种可能解(物品放入/不放入背包); 解空间树为子集树:左子节点(当前物品放入)、右子节点(当前物品不放入) ②约束条件:背包剩余容量 lw ≥ 当前物品重量 w (判断能否生成左孩子结点) 约

金金金夹心脆

动态规划法、贪心算法、回溯法、分支限界法解决0-1背包

1) 动态规划法求解问题的一般思路,动态规划法求解本问题的思路及其C/C++程序实现与算法的效率分析。 2) 贪心算法在0-1背包问题求解中的应用 3) 回溯法求解问题的一般思路,回溯法求解本问题的思路及其C/C++程序实现与算法的效率分析。 4) 分支限界法求解问题的一般思路,分支限界法求解本问题的思路及其C/C++程序实现与算法的效率分析。 有代码!!

HannahKwok

0-1背包问题分支界限法求解-C语言实现

完全版分支界限法求解背包问题,易于理解 分支界限法0-1背包问题

s58420411
评论
收藏 已收藏
分享
返回顶部
proof1
C++ 语言 65,214 成员 250,514 内容