1. 问题描述:
给定 n 个货箱,货箱 i 重为 wi ,船可以装载的货箱总重量为W。货箱装载问题是在不使船翻的前提下装载尽可能多的货箱。
2. 解空间:
假设解可以由向量 (x1, x2, ... , xn) 表示, xi 属于 {0, 1} , xi = 1 表示货箱 i 被装上船, xi = 0 表示货箱 i 不装上船。
3. 约束函数:
令 cw(i) 表示到第 i 层的当前总重量,则约束函数为 C(i) = cw(i-1) + wi
4. 限界函数:
B(i) = C(i) + r(i),其中 r(i) 表示剩余货箱的总重量
5. 剪枝:
若 B(i) <= bestw,则停止搜索第 i 层及其下面的层,否则继续搜索。其中,bestw 表示目前为止得到的最佳重量。
C 语言实现:
//JJU_干干
/*++++++++++++++++++++++++++++++++++++++++++++++++++++
一般解题步骤分为三步
一:针对所给问题,定义问题的解空间
二:确定易于搜索的解空间结构(一般为子集树或者排列树)
三:以深度优先的方式搜索解空间,并且在搜索过程中用减枝函数避免无效搜索
其中子集树就是选一部分,比如0-1背包问题,装载问题,
而排列树就是选所有,只是顺序不一样,例如旅行商(邮递员)问题
++++++++++++++++++++++++++++++++++++++++++++++++++++*/#include#include
#define NUM 100
int n; //集装箱数量
int W; //轮船载重量
int w[NUM]; //集装箱重量
int x[NUM]; //当前搜索的解向量
int r; //剩余集装箱重量
int cw