#分支限界法#最小机器重量设计问题(优先队列)

(⊙o⊙)…,一部分注释的代码直接被吞了~汗~坑~有空再折腾
仅是学习算法时使用一下~(个人感觉不是个多好用的算法,毕竟写起来就很麻烦)
题目:

设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设w[i][j]是从供应商j处购得的部件i的重量,c[i][j]是相应的价格,给出总价格不超过d的最小重量机器设计。

算法设计:

对于给定的机器部件重量和机器部件价格,计算总价格不超过d的最小重量机器设计、

数据输入:

第一行有3个整数,n,m,d。接下来2n行,每行n个数,前n行是c,后n行是w

数据输出:

将计算出的最小重量,以及每个部件的供应商输出




其实自己的优先队列priority_queue的优先级设定是有个改进的空间的。
  • 优先级的设定,当队列中有两个结点的重量是相同的时候,那么设定为,level大的优先级就更高一点,也就是说,更接近于叶子结点的那个结点更优先。目的就是为了更快的刷新出最小的重量,方便后面的剪枝。如果说没有两个结点重量相同,那就重量更小的优先。
    优先级优化思路:类似于旅行售货商问题的优先级设定,记录剩余的未购买原件中的,单个原件购买的最小价值之和。
就是:
物品1   :   3 2 1
物品2   :   2 5 3
物品3   :   2 3 1
假如,物品1已经入队了,且当前重量为3,剩余的最小重量之和为2+1 = 3(物品2和物品3中)总和为5
然后,假如物品2,已经入队了,且当前重量为1+3 =4(第一个物品选择的是1,第二个物品选择的是2),剩余最小重量和为1,总和为5。

也就是说,先执行的其实就是第二个方案。

这种优先级的设定,对于处于不同level的结点,还是有一定的优化作用,毕竟目的就是为了,最快,最先找到一个最小重量,便于后面的剪枝操作。




C++语言
#include<iostream>
using  namespace  std;
int n , m , d;
int  MinWeight;
int  MinValue;
int  ** c   = NULL;
int  ** w = NULL;

struct  Node
{
    int weight;
    int val;
    int source;   //哪个供货商
    int level;         //第几层
    Node * father;
};

//原始的优先级设定



//优化的优先级设定
bool 
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值