【算法】动态规划专题⑥ —— 完全背包问题 python

目录


前置知识

【算法】动态规划专题⑤ ------ 0-1背包问题 + 滚动数组优化


完全背包问题是动态规划中的一种经典问题,它与0-1背包问题相似,但有一个关键的区别:在完全背包问题中,每种物品都有无限的数量可用 。也就是说,你可以选择同一种物品多次放入背包,以使背包中的总价值最大。

示例分析

假设物品重量为 (w = 2, 3),价值为 (v = 3, 4),容量 (C = 5):

容量 (j) 0 1 2 3 4 5
初始化 0 0 0 0 0 0
物品1(w=2) 0 0 3 3 6 6
物品2(w=3) 0 0 3 4 6 7

最优解:选取 1 个物品1(重量2,价值3)和 1 个物品2(重量3,价值4),总价值为7。


进入正题

状态定义

dp[i][j] 表示前 (i) 种物品,背包容量为 j 时的最大总价值。

状态转移方程的推导

核心思想

对第 (i) 种物品,可以选择 0 次或多次 ,因此需要枚举所有可能的选取次数。

暴力枚举

对每种物品 (i) 和容量 (j),假设选取 (k) 次物品 (i),则转移方程为:

缺点 :时间复杂度为 (O(n * C * kmax),其中 kmax= C/ w i w_i wi ,效率极低。


优化推导(消除对 k 的显式枚举)

观察到以下递推关系:

数学证明

假设在容量 (j) 时,最优解中包含 (m \geq 1) 个物品 (i),则总价值为:
dp[i][j] = dp i i i j j j - w i w_i wi + v i v_i vi

这是因为在 ( j j j - w i w_i wi) 容量时,已经考虑了选取 (m-1) 个物品 (i) 的最优解。

因此,状态转移方程简化为:
dp[i][j] = max ( dp[i-1][j], dp i i i j j j - w i w_i wi + v i v_i vi )


模板

完全背包问题 https://www.acwing.com/problem/content/3/

有 N N N 种物品和一个容量是 V V V 的背包,每种物品都有无限件可用。

第 i i i 种物品的体积是 v i v_i vi,价值是 w i w_i wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。

输出最大价值。


输入格式

第一行两个整数, N , V N,V N,V,用空格隔开,分别表示物品种数和背包容积。

接下来 N N N 行,每行两个整数 v i , w i v_i, w_i vi,wi,用空格隔开,分别表示第 i i i 种物品的体积和价值。


输出格式

输出一个整数,表示最大价值。


数据范围

0 < N , V ≤ 1000 0 \lt N, V \le 1000 0<N,V≤1000
0 < v i , w i ≤ 1000 0 \lt v_i, w_i \le 1000 0<vi,wi≤1000


输入样例

复制代码
4 5
1 2
2 4
3 4
4 5

输出样例:

复制代码
10

code:

python 复制代码
n, v = map(int, input().split())
dp = [[0] * (v + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
    wi, vi = map(int, input().split())
    for j in range(1, v + 1):
        if j - wi >= 0:
            dp[i][j] = max(dp[i - 1][j], dp[i][j - wi] + vi)
        else:
            dp[i][j] = dp[i - 1][j]
print(dp[n][v])

滚动数组优化:

python 复制代码
n, v = map(int, input().split())
dp = [0] * (v + 1)
for i in range(1, n + 1):
    wi, vi = map(int, input().split())
    for j in range(wi, v + 1):
        dp[j] = max(dp[j], dp[j - wi] + vi)
print(dp[v])

不了解 滚动数组优化 的可点此进入


END
如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢


相关推荐
果丁智能9 分钟前
智慧校园一卡通深度融合方案:基于超级SIM卡的手机碰一碰智能开锁技术落地实践
数据结构·人工智能·python·科技·算法·智能家居·信息与通信
码来的小朋友13 分钟前
[Python] 制作小游戏创意之3D魔方
python·3d·pygame
老徐聊GEO17 分钟前
芜湖Ai搜索获客亲测有效案例分享
人工智能·python
满怀冰雪17 分钟前
第13篇-栈算法入门-括号匹配-表达式与单调栈基础
java·算法
TCW112120 分钟前
AI底层系列:用C++实现线性代数的公式推导与算法设计-基础篇-5.矩阵方程
人工智能·线性代数·算法
叫我:松哥22 分钟前
基于机器学习和flask的体育健身风险智能分析系统,系统集成DeepSeek、聚类算法、分类算法等,准确率达90%
人工智能·python·神经网络·算法·机器学习·flask·聚类
码云骑士23 分钟前
03-Python可变对象与不可变对象(下)-深浅拷贝的底层真相
开发语言·python
与代码不die不休23 分钟前
RTX5060显卡torch和torch_radon库安装避坑指南(仅linux系统)
linux·图像处理·python·深度学习
砍材农夫24 分钟前
python环境|pip|uv|venv|Conda区别
后端·python·conda·pip·uv
向量引擎24 分钟前
AI API 正在进入“请求生命周期治理”阶段:从模型迁移、Agent 接入到成本与安全排错的工程化方法
java·人工智能·python·aigc·ai编程·ai写作·gpu算力