分支界限法0-1背包问题

示例输入(规定物品数量为10,背包容量为50,输入为20个数,前十个为物品重量,后十个数为物品价值):

12
3
11
5
6
8
9
4
7
10
6
2
7
3
2
9
8
10
4
5
示例输出(最大价值):

44

根据我对算法书上的理解,自己瞎写出了以下代码,但是结果并不正确。不知具体哪里错了,还望大神指出。

先来说说我的理解吧。

分支界限法解决01背包问题:

1)   先求出每个物品的单位重量的价值,并按降序排序;

2)   按此顺序取物品,取或不取的时候都计算出上界:ub=cv+(bagw-cw)(value[i]/weight[i]),即(当前价值+最佳回报*剩余重量);

3)   比较两种情况下的上界ub,选择界限大的方式。前提是选取该物品后总重不会超过背包容量:bagw;

4)一个物品要么选,要么不选,选了就往选了的方式下继续分支,重复2,3,没选就往没选的方式下分支。

但是在计算的过程中,我发现,只要选择的情况下不超过总重量bagw就不会不选它。


#include<stdio.h>

#include<iostream>

#include<queue>

using namespace std;

 

//bool select[10];//定义一个bool型数组用于判定是否选中对应物品;

int bagw=50,bagv,bestvalue,cw,cv;//</

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值