示例输入(规定物品数量为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;//背包可承受重量,背包可承受价值