【算法】动态规划专题⑥ —— 完全背包问题 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:
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])
滚动数组优化:
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
如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢
相关文章:

【算法】动态规划专题⑥ —— 完全背包问题 python
目录 前置知识进入正题模板 前置知识 【算法】动态规划专题⑤ —— 0-1背包问题 滚动数组优化 完全背包问题是动态规划中的一种经典问题,它与0-1背包问题相似,但有一个关键的区别:在完全背包问题中,每种物品都有无限的数量可用。…...

记一次基于manifest v3开发谷歌插件
背景 头疼在国际化功能普遍的前端项目中,如果你在处理或者在某一块功能上新增一些需求的时候,在没有国际化功能的页面中,我们随便复制一些文本,然后在vs code中全局搜索,很快就可以找到所要更改的代码文件在哪里&…...

C# OpenCvSharp 部署MOWA:多合一图像扭曲模型
目录 说明 效果 项目 代码 下载 参考 C# OpenCvSharp 部署MOWA:多合一图像扭曲模型 说明 算法模型的paper名称是《MOWA: Multiple-in-One Image Warping Model》 ariv链接 https://arxiv.org/pdf/2404.10716 效果 Stitched Image 翻译成中文意思是&…...

本地部署DeepSeek-R1模型(新手保姆教程)
背景 最近deepseek太火了,无数的媒体都在报道,很多人争相着想本地部署试验一下。本文就简单教学一下,怎么本地部署。 首先大家要知道,使用deepseek有三种方式: 1.网页端或者是手机app直接使用 2.使用代码调用API …...

神经网络常见激活函数 5-PReLU函数
文章目录 PReLU函数导函数函数和导函数图像优缺点pytorch中的PReLU函数tensorflow 中的PReLU函数 PReLU 参数化修正线性单元:Parametric ReLU 函数导函数 PReLU函数 P R e L U { x x > 0 α x x < 0 ( α 是可训练参数 ) \rm PReLU \left\{ \begin{array}{} x \qua…...

2025我的第二次社招,写在春招之季
先说一个好消息,C那些事 4w star了! 前面断更了一个月,本篇文章就可以看到原因,哈哈。 大家好,我叫光城,腾讯实习转正做后端开发,后去小公司做数据库内核,经过这几年的成长与积累&am…...

Visual Studio Code中文出现黄色框子的解决办法
Visual Studio Code中文出现黄色框子的解决办法 一、vsCode中文出现黄色框子-如图二、解决办法 一、vsCode中文出现黄色框子-如图 二、解决办法 点击 “文件”点击 “首选项”点击 “设置” 搜索框直接搜索unicode选择“文本编辑器”,往下滑动,找到“Un…...

threejs开源代码之-旋转的彩色立方体
效果:旋转的彩色立方体 效果描述: 一个立方体在场景中旋转。立方体的每个面有不同的颜色。使用自定义着色器为立方体添加动态的光影效果。 代码实现 import * as THREE from three; import { OrbitControls } from three/examples/jsm/controls/OrbitC…...

visual studio 2008的试用版评估期已结束的解决办法
visual studio 2008试用期过了后,再次启动时提示:visual studio的试用版评估期已结束。 需要的工具:补丁文件PatchVS2008.exe 解决办法: 1.在“控制面板”-“添加删除程序”中选择visual studio 2008,点击“更改/卸载”…...

解锁 DeepSeek 模型高效部署密码:蓝耘平台深度剖析与实战应用
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

Http和Socks的区别?
HTTP 和 SOCKS 的区别 HTTP 和 SOCKS 都是用于网络通信的协议,但它们在工作原理、应用场景和实现方式上有显著的区别。以下是详细的对比和说明。 一、HTTP 协议 1. 定义 HTTP(HyperText Transfer Protocol)是用于传输超文本数据的应用层协…...

VC播放mp3的方法
1、使用msi库 #include <mmsystem.h> #pragma comment(lib,"winmm.lib") .......//打开文件MCI_OPEN_PARMS mciOpen; mciOpen.lpstrDeviceType _T("mpegvideo"); mciOpen.lpstrElementName _T("c://1.mp3"); MCIERROR mciError mci…...

Docker 部署 verdaccio 搭建 npm 私服
一、镜像获取 # 获取 verdaccio 镜像 docker pull verdaccio/verdaccio 二、修改配置文件 cd /wwwroot/opt/docker/verdaccio/conf vim config.yaml config.yaml 配置文件如下,可以根据自己的需要进行修改 # # This is the default configuration file. It all…...

49-拓展(1)
49-拓展(1) 扩展概述 扩展可以为在当前 package 可见的类型(除函数、元组、接口)添加新功能。 当不能破坏被扩展类型的封装性,但希望添加额外的功能时,可以使用扩展。 可以添加的功能包括: …...

国产编辑器EverEdit - 在文件中查找和替换
1 在文件中查找和替换 1.1 应用场景 某些场景,用户需要在所有工程文件中进行查找和替换关键词,比如:查找工程中哪些文件使用了某个常量。 1.2 使用方法 选择主菜单查找 -> 在文件中查找和替换,或使用快捷键Ctrl Shift F&a…...

安全行业大模型SecLLM技术白皮书
在ChatGPT 呈现全球现象级热度时,通用大语言模型(Large Language Model, LLM)技术成为了推动创新和变革的关键驱动力。但由于安全行业的特殊性和复杂性,LLM 并不能满足其应用需求。安全行业大模型(Security Large Language Model,…...

基础入门-HTTP数据包红蓝队研判自定义构造请求方法请求头修改状态码判断
知识点: 1、请求头&返回包-方法&头修改&状态码等 2、数据包分析-红队攻击工具&蓝队流量研判 3、数据包构造-Reqable自定义添加修改请求 一、演示案例-请求头&返回包-方法&头修改&状态码等 数据包 客户端请求Request 请求方法 …...

2025年日祭
本文将同步发表于洛谷(暂无法访问)、CSDN 与 Github 个人博客(暂未发布) 本蒟自2025.2.8开始半停课。 任务计划(站外题与专题) 数了一下,通过人数比较高的题,也就是我准备补的题&a…...

git命令行删除远程分支、删除远程提交日志
目录 1、从本地通过命令行删除远程git分支2、删除已 commit 并 push 的记录 1、从本地通过命令行删除远程git分支 git push origin --delete feature/feature_xxx 删除远程分支 feature/feature_xxx 2、删除已 commit 并 push 的记录 git reset --hard 7b5d01xxxxxxxxxx 恢复到…...

centOS8安装MySQL8设置开机自动启动失败
提供一个终极解决方案虽然systemctl 更符合管理预期但是不能用 使用一下命令 修改配置文件、修改mysql.service全是问题 systemctl start mysqld systemctl enable mysqld systemctl daemon-reload完全不生效各种报错 提示配置文件内容有问题 Main process exited, codeexite…...

对接DeepSeek
其实,整个对接过程很简单,就四步,获取key,找到接口文档,接口测试,代码对接。 获取 KEY https://platform.deepseek.com/transactions 直接付款就是了(现在官网暂停充值2025年2月7日࿰…...

SpringSecurity高级用法
SpringSecurity的高级用法,包括自定义loginUrl携带参数,自定义认证校验逻辑,自定义权限校验逻辑。 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-advanced-security 一、概述 在项目实际开发过程中,Spr…...

NLP_[2]-认识文本预处理
文章目录 1 认识文本预处理1 文本预处理及其作用2. 文本预处理中包含的主要环节2.1 文本处理的基本方法2.2 文本张量表示方法2.3 文本语料的数据分析2.4 文本特征处理2.5数据增强方法2.6 重要说明 2 文本处理的基本方法1. 什么是分词2 什么是命名实体识别3 什么是词性标注 1 认…...

字符设备驱动开发
驱动就是获取外设、传感器数据和控制外设。数据会提交给应用程序。 Linux 驱动编译既要编写一个驱动,还要编写一个简单的测试应用程序。 而单片机下驱动和应用都是放在一个文件里,也就是杂在一块。而 Linux 则是分开了。 一、字符设备驱动开发流程 Lin…...

c语言:取绝对值
假设我们有一个 long 类型的变量 l,我们希望恢复其绝对值。以下是两种方法的对比: 方法1:使用条件语句 这个很好理解,负数时取负运算 ,用于数值的符号反转。 long abs_value(long l) {if (l < 0) {return -l;} e…...

DeepSeek从入门到精通教程PDF清华大学出版
DeepSeek爆火以来,各种应用方式层出不穷,对于很多人来说,还是特别模糊,有种雾里看花水中望月的感觉。 最近,清华大学新闻与传播学院新媒体研究中心,推出了一篇DeepSeek的使用教程,从最基础的是…...

HTML之CSS定位、浮动、盒子模型
HTML之CSS定位、浮动、盒子模型 定位 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…...

LQB(1)-python-各种基础排序
前言 除了内置的快速排序sort(),python也可以实现冒泡排序、选择排序、插入排序、快速排序、归并排序和桶排序。 一、冒泡排序 (Bubble Sort) 基础代码 def bubble_sort(arr):n len(arr)for i in range(n):swapped False # 优化:若本轮无交换则提前…...

解锁国内主流前端与后端框架
前端框架大揭秘 在当今的 Web 开发领域,前端框架的地位愈发举足轻重。随着用户对 Web 应用交互性和体验性要求的不断攀升,前端开发不再仅仅是简单的页面布局与样式设计,更需要构建复杂且高效的用户界面。前端框架就像是一位得力助手…...

使用OBS推流,srs服务器播放
说明: ffmpeg可以推流,但是是命令行方式不太友好,还可以使用主流的OBS开源推流软件,可从官网Open Broadcaster Software | OBS 下载最新版本,目前很多网络主播都是用它做直播。该软件支持本地视频文件以及摄像头推流。…...