zoukankan      html  css  js  c++  java
  • 动态规划——0/1背包问题

    为了更好地介绍动态规划的思想,在这里我以0/1背包问题为例,具体的为大家解释动态规划求解问题的步骤。

    一、0/1背包问题

    给定n个重量为w1w2,w3,…,wn,价值为p1,p2,p3,…,pn的物品和容量为capacity的背包,求这个物品中一个最有价值的子集,使得在满足背包的容量的前提下,包内的总价值最大

    0-1背包问题指的是每个物品只能使用一次.

    在这里我们可以定义B(i, j),表示考虑从第一件到底 i 件物品,在背包承重为 j 的条件下能拿到的最大价值。

    我们将capacity = 8,n=4,即共4件物品,其重量与价值如下表:

     

     最终的为题即是求解B(4, 8)。

    思路

    通过简单的B(i, j)如B(0,0),B(0,1)来计算更复杂的B(i, j),直到计算出B(4, 8)。

    在这里我们可以得出一个递推公式:

    在这里用一个二维数组来保存B(i, j):

     那么我们在这里就可以用一个二维数组来实现上图的表格:

    w = [0,2,3,4,5] # 物品重量
    p = [0,1,2,5,6] # 物品价值
    n_item = len(w)-1 # 物品个数
    capacity = 8 # 背包可承受的重量
    
    table = [[0 for column in range(capacity+1)] for row in range(n_item+1)]# 遍历二维数组
    for i in range(1,n_item+1):
        for j in range(1,capacity+1):
            if j < w[i]:
                table[i][j] = table[i-1][j]
            else:
                table[i][j] = max(table[i-1][j],table[i-1][j-w[i]]+p[i])
    
    for i in table:
        print(i)

    可以得到结果如下:

  • 相关阅读:
    python抓取网站的图片并下载到本地
    常用的python模块及安装方法
    Linux查看进程和终止进程的技巧
    Linux中source命令的用法
    Pyhone 验证码那些事之安装pytesseract
    python Queue模块
    vi/vim多行注释和取消注释
    IdentityServer4第二次介入了解(1)
    一、JS前端排查小技巧
    IIS部署Core3.1
  • 原文地址:https://www.cnblogs.com/sunny0824/p/13499571.html
Copyright © 2011-2022 走看看