c1 = 55 # 第一艘船的容量
c2 = 35 # 第二艘船的容量
w = [20,15,20,30] # 每个货物对应重量
def loading(c1,c2,w):
Max = 0 # 初始化第一艘船中的当前最大载重量
X = [] # 初始化最优解
n = len(w)
x = [0] * n
cw = 0 # 当前总重量
r = sum(w) # 未考虑的物品总重量
i = 0
if c1 + c2 < r:
print('此问题无解')
return
while True:
while i < n and cw + w[i] <= c1: # 访问左子树
cw += w[i]
r -= w[i]
x[i] = 1
i += 1
if i == n: # i超出了解的下标
if cw > Max:
X = x[:]
Max = cw
else: # 访问右子树
x[i] = 0
r -= w[i]
i += 1
# 现在,i记录了被访问物品的下一个索引
while cw + r <= Max:
i -= 1 # 将i指向被访问物品索引
while i >= 0 and x[i] == 0: # 该物品没被选中,不影响限界函数
r += x[i]
i -= 1
if i < 0: # 回溯过了第0个物品,即找到最优解
print('最优解为:',X)
return
# 以下访问右子树
x[i] = 0
cw -= w[i]
r += w[i]
i += 1 # 将i指向被访问物品的下一个索引
loading(c1,c2,w)
输出:
最优解为: [1, 1, 1, 0]