背包问题算法

背包问题算法

0-1背包问题

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

二维数组

python 复制代码
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])

一维数组

python 复制代码
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,求背包能装的物品的最大价值是多少,每种物品的数量最多不限

二维数组

python 复制代码
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])

一维数组

python 复制代码
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]

一维数组

python 复制代码
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])
相关推荐
wuyk55513 小时前
Python 第三章:列表 List
服务器·开发语言·python
笨鸟先飞,勤能补拙13 小时前
从预测到决策:人工智能与机器学习的系统方法、工程闭环与现实边界
大数据·人工智能·windows·python·机器学习·密码学
MgArcher14 小时前
抖音a_bogus参数逆向实战:JSVMP环境模拟与Hook技术(2025最新)
javascript·爬虫·python
circuitsosk14 小时前
AI输出的“质检员”:构建智能体质量评估、异常检测与人工兜底的三层防线
人工智能·python·microsoft·正则表达式·langchain
要努力点14 小时前
Python入门第六课
开发语言·python
Fa_Mian_Tuan14 小时前
图论基础|邻接矩阵超详细讲解(含无向/有向/带权图+完整可运行C语言代码)
c语言·数据结构·笔记·算法·图论
hanhahai14 小时前
指针与函数(函数指针与指针函数)
算法
CTA终结者14 小时前
先用小策略练清条件和动作
人工智能·python
Bruce_Liuxiaowei15 小时前
从零到可运行:基于 Vue3 + FastAPI + DeepSeek-V3 的 AI 英语单词学习系统全栈实战
人工智能·python·学习·fastapi·全栈·智能体
ValhallaCoder15 小时前
Leetcode-hot100(2026.08.17)
python·算法·leetcode