首页 > 其他分享 >装载问题-分支限界法-队列式分支限界法

装载问题-分支限界法-队列式分支限界法

时间:2023-05-25 17:05:19浏览次数:47  
标签:QNode parent 队列 bestE int wt bestw 限界 分支


装载问题实质: 装载问题是一个子集选取问题,因此其解空间树是一颗子集树。

这里实现队列式分支限界法,对难理解地方做了注释。

#include <bits/stdc++.h>
using namespace std;
typedef struct QNode
{
    QNode *parent;
    int lchild;
    int weight;
}QNode;
int n;
int c;
int bestw;
int w[100];
int bestx[100];
void InPut()
{
    scanf("%d %d", &n, &c);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &w[i]);
//    for(int i = 1; i <= n; ++i)
//        printf("%d ", w[i]);
//    cout << endl;
//    printf("输入结束\n");
}
//QNode *&bestE 的原因是 首先bestE是个地址, 其次引用为了赋值使用, 后边for循环中用到
void EnQueue(queue<QNode *> &q, int wt, int i, QNode *E, QNode *&bestE, int ch)
{
    if(i == n)
    {
        if(wt == bestw)
        {
            bestE = E;
            bestx[n] = ch;
            return;
        }
    }
    QNode *b;
    b = new QNode;
    b->weight = wt;
    b->lchild = ch;
    b->parent = E;
    q.push(b);
}
int MaxLoading()
{
    queue<QNode *>q;
    q.push(0);
    int i = 1;
    int Ew = 0, r = 0;
    bestw = 0;
    for(int j = 2; j <= n; ++j)
        r += w[j];
    QNode *E, *bestE; //bestE的作用是:结束while循环后,bestE指向最优解的叶子节点,然后通过bestE->parent找到装入了哪些物品。
    E = new QNode; //E这里作为一个中间量,连接parent和child
    E = 0;         //赋0是因为树的根的值是0,while刚开始的时候其代表root
    while(true)
    {
        int wt = Ew + w[i];
        if(wt <= c)
        {
            if(wt > bestw)
                bestw = wt;
            EnQueue(q, wt, i, E, bestE, 1);
        }
        if(Ew + r >= bestw)
        {
            EnQueue(q, Ew, i, E, bestE, 0);
        }
        E = q.front();
        q.pop();
        if(!E)
        {
            if(q.empty())
                break;
            q.push(0);
            E = q.front();
            q.pop();
            i++;
            r -= w[i];
        }
        Ew = E->weight; //不要忘记更新最新节点的值
    }
    for(int j = n - 1; j > 0; --j)
    {
        bestx[j] = bestE->lchild;
        bestE = bestE->parent;
    }
}
void OutPut()
{
    printf("最优装载量为 %d\n", bestw);
    printf("装载的物品为 \n");
    for(int i = 1; i <= n; ++i)
        if(bestx[i] == 1)
          printf("%d ", i);
}
int main()
{
    InPut();
    MaxLoading();
    OutPut();
}

测试数据:

输入:

4 60
10
40
50

20

输出

最优装载量为 60
装载的物品为
2 4

运行截图:

装载问题-分支限界法-队列式分支限界法_for循环

标签:QNode,parent,队列,bestE,int,wt,bestw,限界,分支
From: https://blog.51cto.com/u_16129621/6350068

相关文章

  • Idea中Git分支、合并与使用
    1.分支的新建与合并使用场景介绍让我们来看一个简单的分支新建与分支合并的例子,实际工作中你可能会用到类似的工作流。你将经历如下步骤:开发某个网站。为实现某个新的需求、问题(#53问题),创建一个分支(名为:iss53)。在这个分支上开展工作。正在此时,你突然接到一个电话......
  • Luogu P1903 [国家集训队] 数颜色 / 维护队列
    题目来源https://www.luogu.com.cn/problem/P1903[国家集训队]数颜色/维护队列题目描述墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会向你发布如下指令:\(Q\L\R\)代表询问你从第\(L\)支画笔到第\(R\)支画笔中共有几种......
  • 单片机消息队列的实现原理和机制2
    出处消息队列在RTOS中基本都有消息队列这个组件,也是使用最常见的组件之一。1.消息队列的基本概念消息队列是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任务间传递信息,实现了任务接收来自其他任务或中断的不固定长度的消息。通过消息队列服务,任务或中断服务......
  • 单片机消息队列的实现原理和机制1
    出处单片机开发过程中通常会用到“消息队列”,一般实现的方法有多种。本文给大家分享一下队列实现的原理和机制。环形队列环形队列是在实际编程极为有用的数据结构,它是一个首尾相连的FIFO的数据结构,采用数组的线性空间,数据组织简单,能很快知道队列是否满为空,能以很快速度的来存......
  • 5_24_打卡_数据结构之循环队列
    //循环队列可存储数据数量是maxsize-1//队列长度为(front-rear+maxsize)%maxsize//队列为空时front==rear//队列满时(front+1)%maxsize==rear;#defineMAXSIZE5#include<iostream>usingnamespacestd;typedefstructqueue{ intfront; intrear; intdata[MAXSIZE];}......
  • 优先队列---priority_queue
    代码:#include<bits/stdc++.h>usingnamespacestd;priority_queue<int>q; //优先队列,每次将最大值放在队首,通过push取出队首元素;若要取最小值,将入队元素变为负数即可inta,b,c,max1,min1,min2;intmain{cin>>a>>b>>c;q.push(a),q.p......
  • 拉取代码、分支、文件操作等基本GIT命令使用
    1.打开gitlab,登录账号2.在自己的projects里面能看看到项目列表: 3.点进去项目“mygit”:  4.复制路径:  5.把地址拷贝到终端,加上gitclone指令: 6.输入完成指令之后,按下回车,就把代码拉取下来了,如下图,ll查看一下拉去的代码:   二。分支常见命令: 1.首先......
  • Git强行替换覆盖master分支(转)
    应用场景说明:在开发中,通常会保持一个主分支master,及多个dev分支,但是因为dev分支的开发周期过长,迭代太多而没有及时维护master,导致后来发版上线的大部分代码都在dev分支上,如果将代码在master分支合并会导致很多冲突,最后想丢弃原始master分支上的代码,直接将已经测试确......
  • vs git 分支缓存问题
    我们项目不停的开发,就会产生很多本地分支,但实际上git服务器上早就合并了,没有这么多分支,但VisualStudioGit分支本地一大堆,手动一个个删除太费时间。使用如下两条命令可以切换VisualStudioGit分支以git服务器上的分支为主,本地不做缓存。cmd或者gitbash直接执行gitconfig--g......
  • 代码随想录算法训练营第10天 | ● 理论基础 ● 232.用栈实现队列 ● 225. 用队列实现
     第五章 栈与队列part01●  day 1 任务以及具体安排:训练营一期day 1 ●  day 2 任务以及具体安排:day 2 第一章数组●  day 3 任务以及具体安排:day 3 第二章 链表●  day 4 任务以及具体安排:day 4 第二章 链表●  day 5 周日休息●  ......