动态规划求解0-1背包问题

# -*- 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值