穷举法解决0/1背包问题——python代码实现

“”“使用穷举法解决0/1背包问题。问题描述:给定n个重量为{w1, w2, … ,wn}、价值为{v1, v2, … ,vn}的物品和一个容量为C的背包,求这些物品中的一个最有价值的子集,且要能够装到背包中。”""

"""使用穷举法解决0/1背包问题。
问题描述:给定n个重量为{w1, w2, … ,wn}、价值为{v1, v2, … ,vn}的物品和一个容量为C的背包,求这些物品中的一个最有价值的子集,且要能够装到背包中。
"""
weight = []  # 重量
value = []    # 价值
choose = []  # 选择方式
B = []   # 把每个物品的选择转化为整数并分别列出
C = []  # 最大价格所选择的方法
D = []   # 把每种选择转化为一个列表组成一个新的选择列表
vmax = 0   # 最大价值
W = 0   # 这个选择的重量
V = 0   # 这个选择的价值
t = int(input("请输入问题规模:"))
M = int(input("请输入背包的最大承重量:"))
# 输入
for cishu in range(t):
    weight.append(int(input("请输入第%d个物品的重量" % cishu)))
    value.append(int(input("请输入第%d个物品的价格" % cishu)))
# 将选择转化为二进制
for xuanze in range(pow(2, t)):
    choose.append('{0:05b}'.format(xuanze))
# print(weight)
# print(value)
# print(choose)
u = 1    # 列表的第几个元素
while u < int(pow(2, t)):
    # 把这个选择划分到每个物品
    for s in choose[u]:
        s = int(s)
        B.append(s)
    B.reverse()
    D.append(B)
    u += 1
    B = []
# print(D)
f = 0
while f < (pow(2, t)-1):
    i = 0
    while i < t:
        W += D[f][i] * weight[i]
        V += D[f][i] * value[i]
        i += 1
    f = f + 1
    if W <= M:

        if V > vmax:
            vmax = V
            C.clear()
            C.append(D[f-1])
            W = 0
            V = 0
        elif V == vmax:
            C.append(D[f-1])
            W = 0
            V = 0
        else:
            W = 0
            V = 0

    else:
        W = 0
        V = 0

C = str(C)
print("最大价值是%d" % vmax)
print("对应的取法是:"+C)
print("""其中’1‘是取对应位置的物品,’0‘为不取;一个[]为一种取法\n
      这个是为规模为5所设置的,若规模小于5,规模是几看前几位,\n
      若大于五则需更改代码第18行5为此时规模\n""")

你可能感兴趣的:(算法实验,python,算法)