# -*- coding:utf-8 -*-
import numpy as np
def solve(value_list, weight_list, total_weight, total_length):
res_arr = np.zeros((total_length + 1, total_weight + 1), dtype=np.int32)
for i in range(1, total_length + 1):
for j in range(1, total_weight + 1):
if weight_list[i] <= j:
res_arr[i, j] = max(res_arr[i - 1, j - weight_list[i]] + value_list[i], res_arr[i - 1, j])
else:
res_arr[i, j] = res_arr[i - 1, j]
q = []
i = total_length
j = total_weight
while i >= 1:
if res_arr[i][j] > res_arr[i - 1][j]:
q.append(1)
j -= weight_list[i]
i -= 1
else:
q.append(0)
i -= 1
q = q[::-1]
# 求解最优解占用容量
c = 0
for i in range(len(q)):
if q[i] == 1:
c += weight_list[i + 1]
# 输出
print('背包容量为:', total_weight)
print('物品质量向量为:\t ', weight_list[1:])
print('物品价值向量为:\t ', value_list[1:])
print('动态规划,解决方案为:', q)
print('最大价值为:', res_arr[-1, -1], '。此时占用容量为:', c, '。剩余容量为:', total_weight - c)
# 填表结果
print('填表结果为:')
for i in res_arr:
for j in i:
print('%4d' % j, end='')
print()
def main():
v = [0, 6, 3, 5, 4, 6]
w = [0, 2, 2, 6, 5, 4]
tw = 10
n = 5
solve(v, w, tw, n)
if __name__ == '__main__':
main()
动态规划求解0-1背包问题
最新推荐文章于 2021-04-05 17:31:44 发布