背包问题算法

0-1背包问题

问题:背包的容量为9,有重量分别为[2, 4, 6, 9]的四个物品,价值分别为[3, 4, 5, 6],求背包能装的物品的最大价值是多少,每种物品的数量最多为1

二维数组

w = [2, 4, 6, 9]  # 重量
v = [3, 4, 5, 6]  # 价值
c = 9  # 最大容量
n = len(w)  # 物品数量
w.insert(0, 0)
v.insert(0, 0)
dp = [[0] * (c + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
    for j in range(1, c + 1): # 正向
        if j >= w[i]:
            dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i])
        else:
            dp[i][j] = dp[i - 1][j]

for rows in dp:
    print(rows)
print('最大value:', dp[n][c])

一维数组

w = [2, 4, 6, 9]  # 重量
v = [3, 4, 5, 6]  # 价值
c = 9  # 最大容量

n = len(w)  # 物品数量
w.insert(0, 0)
v.insert(0, 0)
dp = [0] * (c + 1)
for i in range(1, n + 1):
    for j in range(c, 0, -1): # 逆向
        if j >= w[i]:
            dp[j] = max(dp[j], dp[j - w[i]] + v[i])
    print(dp)
print('最大value:', dp[c])

完全背包问题

问题:背包的容量为9,有重量分别为[2, 4, 6, 9]的四个物品,价值分别为[3, 4, 5, 6],求背包能装的物品的最大价值是多少,每种物品的数量最多不限

二维数组

w = [2, 4, 6, 9]  # 重量
v = [3, 4, 5, 6]  # 价值
c = 9  # 最大容量

n = len(w)
w.insert(0, 0)
v.insert(0, 0)

dp = [[0] * (c + 1) for _ in range(n + 1)]

for i in range(1, n + 1):
    for j in range(1, c + 1): # 正向
        if j >= w[i]:
            dp[i][j] = max(dp[i - 1][j], dp[i][j - w[i]] + v[i])
        else:
            dp[i][j] = dp[i - 1][j]
for values in dp:
    print(values)
print('最大value:', dp[n][c])

一维数组

w = [2, 4, 6, 9]  # 重量
v = [3, 4, 5, 6]  # 价值
c = 9  # 最大容量

n = len(w)

w.insert(0, 0)
v.insert(0, 0)

dp = [0] * (c + 1)

for i in range(1, n + 1):
    for j in range(0, c + 1): # 正向
        if j >= w[i]:
            dp[j] = max(dp[j], dp[j - w[i]] + v[i])
    print(dp)
print('最大value:', dp[c])

多重背包问题

问题:背包的容量为10,有重量分别为[2, 4, 6, 9]的四个物品,价值分别为[3, 4, 5, 6],求背包能装的物品的最大价值是多少,每种物品的数量最多分别为[2, 1, 2, 1]

一维数组

w = [2, 4, 6, 9]  # 重量
v = [3, 4, 5, 6]
counts = [2, 1, 2, 1]  # 数量
c = 10  # 最大容量
n = len(w)

w.insert(0, 0)
v.insert(0, 0)
counts.insert(0, 0)

dp = [0] * (c + 1)

for i in range(1, n + 1):
    for j in range(c, 0, -1): # 逆向
        for k in range(1, counts[i] + 1):
            if j >= k * w[i]:
                dp[j] = max(dp[j], dp[j - k * w[i]] + v[i])
    print(dp)
print('最大value:', dp[c])

相关推荐

  1. 贪心算法-活动选择问题&背包问题

    2024-03-10 02:02:03       28 阅读
  2. 算法日记-02完全背包和多重背包问题总结

    2024-03-10 02:02:03       43 阅读
  3. C++分组背包问题_动态规划dp_背包_算法竞赛

    2024-03-10 02:02:03       22 阅读
  4. 动态规划算法解决背包问题(Python)

    2024-03-10 02:02:03       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-10 02:02:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-10 02:02:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-10 02:02:03       87 阅读
  4. Python语言-面向对象

    2024-03-10 02:02:03       96 阅读

热门阅读

  1. 获取通知细节信息

    2024-03-10 02:02:03       49 阅读
  2. linux禁止被ping的方法

    2024-03-10 02:02:03       46 阅读
  3. MySQL客户端和服务器进程通信的几种方式

    2024-03-10 02:02:03       39 阅读
  4. svn + ssh

    2024-03-10 02:02:03       54 阅读
  5. Unix Network Programming Episode 88

    2024-03-10 02:02:03       47 阅读
  6. elementUI Table组件点击取当前行索引

    2024-03-10 02:02:03       43 阅读