装载问题
问题描述
有一批货物重量为wi ,需要将其装入两艘货轮,货轮限重c1、c2,现在问其能否成功全部装入货轮,若可以请输出一种装载方案。
问题分析
易知,如果我们先尽可能的将其中一艘货轮装满(使其装载量达到不超过其限重的最大值),剩下的重量如不能装入第二艘货轮,即不能装入。
所以我们主要解决的是 要怎样使第一艘货轮达到最大值。
这个问题的解决方案有许多种:
- 动态规划
- 深搜–回溯法
- 广搜–分支限界法
此文章主要讲解深搜–回溯法
此问题与极大团的思路相似,对于每个货物都是有两种可能(放入第一艘或不放),于是这样我们可以很清楚的构造出一棵二叉树,其叶子结点有2n个。
并且在不放入的情况下,需要计算其是否可以成为最大装载的潜力,若没有,则把这一条分支剪掉。
代码实现
数据结构的设计
bw记录最优解的重量
bx[] 数组记录最优解的方案
cw记录当前搜索下假设已经装入的重量
r记录剩余的重量
x[]记录是否装入
代码
#include <iostream>
using namespace std;
int bw,cw;
int r;
int x[i],bx[i];
int w[i];
int n,c1,c