繁星326 2022-05-19 16:11 采纳率: 20%
浏览 42
已结题

回溯法解决0-1背包问题

结果的最优解x莫名其妙就被改了,看了好几遍都不知道在哪里改的

def bound(cv, cw, w, v, k, dw, n): #对剩余物品做贪心选择
b = cv #当前价值总量
c = cw #当前背包已用容量
for i in range(k+1, n):
if c+w[i] <= dw:
c = c + w[i]
b = b + v[i]
else:
b = b + v[i]*((dw-c)/w[i])
break
return b

def bt_Knapsack(dw, n, w, v, fw, fv, x):
cw = cv = 0
k = 0 #表示第k+1件物品
y = [0 for i in range(n)] #设置临时解向量
while(1):
while k<n and (cw+w[k])<=dw:
cw = cw + w[k]
cv = cv + v[k]
y[k] = 1
k = k + 1
if k>=n: #全部考查完,找到可行解
fv = cv
print('value:',fv)
fw = cw
x = y
print('solution x:', x) # 最优解
k = n-1
else: #k超重,不能装入
y[k] = 0
while bound(cv, cw, w, v, k, dw, n) <= fv: #无更优解
while k != -1 and y[k] != 1: # 回溯
k = k - 1
if k == -1:
break
y[k] = 0
cw = cw - w[k]
cv = cv - v[k]
if k == -1:
break
k = k + 1
print('maxValue:', fv) # 最优值
print('solution:', x) # 最优解

n = 8
dw = 110
w = [1,11,21,23,33,43,45,55]
v = [11,21,31,33,43,53,55,65]
x = [0 for i in range(n)]
fw = 0
fv = -1 #已找到的某个可行解的最大价值。求最大,初值为-1
bt_Knapsack(dw, n, w, v, fw, fv, x)

img

  • 写回答

1条回答 默认 最新

  • 请叫我问哥 Python领域新星创作者 2022-05-19 16:39
    关注

    代码格式较乱,不过猜测问题出在x = y这里,列表的浅拷贝,两个变量指向了同一个列表地址。所以后面执行到y[k] = 0的时候,即使没有再赋值,x也会变成和y一样全0的列表。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月27日
  • 已采纳回答 5月19日
  • 创建了问题 5月19日

悬赏问题

  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行