当前位置: 首页 > news >正文

蓝桥杯(5):python动态规划DF[2:背包问题]

1 0-1背包介绍【每件物品只能拿1件或者不拿】

1.1 简介

贪心是不可以的!!!

1.2 状态 及状态转移

转移解释:要么不选 则上一个直接转移过来【dp[i-1][j]】,要么是选这个之后体积为j 则上一个对应的就是【dp[i-1][j-wi] + v[i]】 选上这个之后价值叫上哦!!1

1.3 代码

n,v= list(map(int,input().split()))
w = [0]
value = [0]
for i in range(n):w_v = list(map(int,input().split()))w.append(w_v[0])value.append((w_v[1]))
# print(w)
# print(value)
'''容量总共为V
不超过v的时候价值最大
求最大价值--是矩阵中的值,那么还有两个指标分别是 物品数和容量
dp[i][j]表示前i个物品当体积为j时对应的价值''''''找到状态之后 想状态转移方程:
如果第i个物品不拿 dp[i][j] = dp[i-1][j]
如果第i个物品拿 dp[i][j] = dp[i-1][j-w[i]]+value[i]
要最大的价值 则选最大的 决定拿还是不拿'''
dp = [[0]*(v+1) for i in range(n+1)]
for i in range(1,n+1):for j in range(1,v+1):if j>=w[i]: # 说明存在第i个拿出来这种情况dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]]+value[i])else:dp[i][j] = dp[i-1][j]print(dp[n][v])

2 滚动数组优化

发现在上方的代码中 更新第i行只用到了i-1行的数据,所有可以把空间压缩为2

然后对代码做以下改变即可

3 完全背包【每件物品可以拿0件1件2件一直到无数件】

3.1 定义

每个物品可以不拿或者拿一件 两件。。。这样

有三个参数了现在,依次枚举i,j,k 三重循环时间代价太大了

怎么优化时间呢?

3.2 代码实现

n,v= list(map(int,input().split()))
w = [0]
value = [0]
for i in range(n):w_v = list(map(int,input().split()))w.append(w_v[0])value.append((w_v[1]))
# print(w)
# print(value)dp = [[0]*(v+1) for i in range(n+1)]
for i in range(1,n+1):for j in range(1,v+1):if j>=w[i]: # 说明存在第i个拿出来这种情况dp[i][j] = max(dp[i-1][j], dp[i][j-w[i]]+value[i])else:dp[i][j] = dp[i-1][j]print(dp[n][v])

4 多重背包【0-1背包和完全背包的结合体】

4.1 定义

每种物品可是可以多拿但是有一个上限!!

不拿的情况也包含在上面的那个式子里了,所以更新值只需要 和自己比 留下最大的即可!!!

完全背包没有办法控制上限,所以我们只能老老实实的三重循环。。。

4.2 三重循环代码

n,v= list(map(int,input().split()))
w = [0]
value = [0]
s = [0]
for i in range(n):w_v_s = list(map(int,input().split()))w.append(w_v_s[0])value.append(w_v_s[1])s.append(w_v_s[2])
# print(w)
# print(value)
'''容量总共为V
不超过v的时候价值最大
求最大价值--是矩阵中的值,那么还有两个指标分别是 物品数和容量
dp[i][j]表示前i个物品当体积为j时对应的价值''''''找到状态之后 想状态转移方程:
如果第i个物品不拿 dp[i][j] = dp[i-1][j]
如果第i个物品拿 dp[i][j] = dp[i-1][j-w[i]]+value[i]
要最大的价值 则选最大的 决定拿还是不拿'''
dp = [[0]*(v+1) for i in range(n+1)]
for i in range(1,n+1):for j in range(1,v+1):for m in range(0, min(s[i],j//w[i])+1):# if j >= m*w[i]: # 说明存在第i个拿出来这种情况dp[i][j] = max(dp[i][j], dp[i-1][j-m*w[i]]+m*value[i])# 和0-1背包的区别就是dp[i-1][j-w[i]]变成了dp[i][j-w[i]]# else:#     dp[i][j] = dp[i][j]print(dp[n][v])

4.3 二进制优化后代码

新策略:二进制的拆si  !!!!!!!!!!!!!

普通拆发:

二进制的拆法:

##二进制优化
import sysdef put(_w, _v):for j in range(v, _w - 1, -1):dp[j] = max(dp[j], dp[j-_w] + _v)n, v = map(int, sys.stdin.readline().split())
dp = [0]*(v + 1)
for _ in range(n):weight, value, i = map(int, sys.stdin.readline().split())tmp = 1while i >= tmp:put(weight * tmp, value * tmp)i -= tmptmp <<= 1if i > 0:put(weight * i, value * i)
print(dp[v])

5 二维费用背包

5.1 定义

状态转移方程:

空间上受不了,用滚动数组

可以把i删掉

5.2 代码

N,V,M=map(int, input().split())
dp = [[0]*(M+1) for i in range(V+1)]for i in range(1,N+1):vi,mi,wi = map(int, input().split())for j in range(V,vi-1,-1):for k in range(M,mi-1,-1):#dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][j-vi][k-mi]+wi)dp[j][k] = max(dp[j][k], dp[j-vi][k-mi]+wi)
print(dp[V][M])

6 分组背包

很像01背包

'''
分组背包:
每组中只能选择一个物品
状态转移方程与0-1背包一样,唯一的区别是:在更新状态时要多与自己比较一次
不用一维滚动数组优化时,遍历顺序是每组,组中每个元素,背包容量
使用一维滚动数组优化时,遍历顺序是每组,背包容量,组中每个元素(可防止组中元素被选择多次)
'''##1、没有优化空间
N,V = map(int,input().split())
dp = [[0]*(V+1) for i in range(N+1)]
# dp[i][j]表示前i组物品体积不超过j的最大价值
#最终的答案dp[N][V]for i in range(1,N+1): # 对于每个组s = int(input())for q in range(s): # 对于每个组中的每个物品w,v = map(int,input().split())   #获取每个物品的质量与价值for j in range(0,V+1):   #对于当前背包容量if j< w:   #分组背包更新状态时,要比其他背包多一次比较,即要与本身做一次比较dp[i][j] = max(dp[i][j], dp[i-1][j])else:dp[i][j] = max(dp[i][j],dp[i-1][j],dp[i-1][j-w] + v)print(dp[N][V])#2.两行滚动数组优化N,V = map(int,input().split())
dp = [[0]*(V+1)for i in range(2)]for i in range(1,N+1):#对于每个组s = int(input())for _ in range(s): #对于每个组中的每个物品w,v = map(int,input().split())   #获取每个物品的质量与价值for j in range(1,V+1):   #对于当前背包容量if j< w:   #分组背包更新状态时,要比其他背包多一次比较,即要与本身做一次比较dp[i%2][j] = max(dp[i%2][j], dp[(i-1)%2][j])else:dp[i%2][j] = max(dp[i%2][j],dp[(i-1)%2][j],dp[(i-1)%2][j-w] + v)print(dp[N%2][V])#3 一维滚动数组优化 YYDS
N,V = map(int,input().split())
dp = [0]*(V+1)
for i in range(1,N+1):#对于每个组s = int(input())group =  []for _ in range(s): #对于每个组中的每个物品group.append([*map(int,input().split())])#分组包采用一维滚动数组时,需先遍历背包容量,再遍历每组每个物品的质量与价值,否则会出现一组中的物品被选择多次的情况for j in range(V,-1,-1):   #对于当前背包容量for w,v in group:   #获取每个物品的质量与价值if j>=w:  #背包容量不能小于物品质量,不然装不了#分组背包更新状态时,要比其他背包多一次比较,即要与本身做一次比较dp[j] = max(dp[j],dp[j-w] + v)
print(dp[V])

相关文章:

蓝桥杯(5):python动态规划DF[2:背包问题]

1 0-1背包介绍【每件物品只能拿1件或者不拿】 1.1 简介 贪心是不可以的&#xff01;&#xff01;&#xff01; 1.2 状态 及状态转移 转移解释&#xff1a;要么不选 则上一个直接转移过来【dp[i-1][j]】&#xff0c;要么是选这个之后体积为j 则上一个对应的就是【dp[i-1][j-wi]…...

臻奶惠无人售货机:新零售时代的便捷消费革命

臻奶惠无人售货机&#xff1a;新零售时代的便捷消费革命 在新零售的浪潮中&#xff0c;智能无人售货机作为一个创新的消费模式&#xff0c;已经成为距离消费者最近的便捷购物点之一。这种模式不仅能够满足居民对消费升级的需求&#xff0c;还能通过建立多样化和多层次的消费体…...

4月04日,每日信息差

&#x1f396; 素材来源官方媒体/网络新闻 &#x1f384; 地震预警App被曝收10元年费&#xff0c;回应称仅限苹果系统 &#x1f30d; 2024清明档首日票房破2亿 &#x1f30b; 浙江省杭州市余杭区设立2亿元网络微短剧发展基金 &#x1f381; 抖音拟以超 7.5 亿元收购海联金汇旗下…...

C++数据结构——顺序表——数值统计

C数据结构——顺序表——数值统计 接着上一篇的顺序表模板。 输入数组&#xff0c;统计数组中的负数、零、正数的个数。第一个数字,表示数组有几个数,当n为0时&#xff0c;输入结束&#xff0c;不做处理。 例如&#xff1a; 输入6 0 1 2 3 -1 0 输出1 2 3 int main() {int n;…...

Linux+HA高可用24X7的安全保证

一&#xff0e; 介绍作为服务器&#xff0c;需要提供一定的24X7的安全保证&#xff0c;这样可以防止关键节点的宕机引起系统的全面崩溃。利用OpenSource开源软件&#xff0c;完成系统的高可靠双机热备方案。基于linux的 HA软件可靠稳定&#xff0c;比使用商业版本的HA软件降低成…...

【Tomcat】Apache官方结束Tomcat 8.5分支版本技术支持

根据 Apache 官方发布的声明&#xff0c;Apache官方将于2024年3月31日后正式结束对于Tomcat 8.5这个分支版本的技术支持&#xff0c;包括以下几点&#xff1a; 1&#xff09;不太可能继续为 8.5 分支发布新的版本&#xff1b; 2&#xff09;仅影响 8.5 分支的漏洞将不会被解决&…...

Go 源码之读写锁 sync.RWMutex

Go 源码之读写锁 sync.RWMutex 文章目录 Go 源码之读写锁 sync.RWMutex一、简介二、源码(一)RWMutex数据结构(二)Lock(三)Unlock(四)TryRLock(五)Rlock(六)RUnlock三、常见问题1. 什么是CAS,什么是原子操作2. 写操作是如何阻止写操作的3. 写操作是如何阻止读操作的…...

大数据实验统计-1、Hadoop安装及使用;2、HDFS编程实践;3、HBase编程实践;4、MapReduce编程实践

大数据实验统计 1、Hadoop安装及使用&#xff1b; 一&#xff0e;实验内容 Hadoop安装使用&#xff1a; 1&#xff09;在PC机上以伪分布式模式安装Hadoop&#xff1b; 2&#xff09;访问Web界面查看Hadoop信息。 二&#xff0e;实验目的 1、熟悉Hadoop的安装流程。 2、…...

PyTorch搭建Informer实现长序列时间序列预测

目录 I. 前言II. InformerIII. 代码3.1 输入编码3.1.1 Token Embedding3.1.2 Positional Embedding3.1.3 Temporal Embedding 3.2 Encoder与Decoder IV. 实验 I. 前言 前面已经写了很多关于时间序列预测的文章&#xff1a; 深入理解PyTorch中LSTM的输入和输出&#xff08;从i…...

firefox切换本地服务和全球服务的方法

方法1&#xff1a;“设置”>“同步">“切换全球/本地服务器” https://jingyan.baidu.com/article/1974b2898523bbb5b1f774e2.html 方法2&#xff1a;地址栏输入about:config&#xff0c;搜索首选项名称里输入identity.fxaccounts.autoconfig.uri&#xff0c;填入…...

Windows下用CMake编译PugiXML及配置测试

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 PugiXML是什么&#xff1f; PugiXML 是一个用于解析和操作 XML 文档的 C 库。它提供了简单易用的接口&#xff0c;能够高效地加载…...

python-基础篇-字符串、列表、元祖、字典-列表

文章目录 2.3.2列表2.3.2.1列表介绍2.3.2.1.1列表的格式2.3.2.1.2打印列表 2.3.2.2列表的增删改查2.3.2.2.1列表的遍历2.3.2.2.1.1使用for循环2.3.2.2.1.2使用while循环 2.3.2.2.2添加元素("增"append, extend, insert)2.3.2.2.2.1append 2.3.2.2.2.2extend2.3.2.2.2…...

Qt控件样式设置其一(常见方法及优缺点)

如果你对Qt有基本的了解&#xff0c;应该知道它的一大优点是跨平台&#xff0c;可以在不同的系统中编译运行。但在我看来&#xff0c;Qt还有另外一个优点&#xff0c;就是制作界面比较方便和灵活&#xff0c;能够实现主流静态效果的桌面应用。&#xff08;如果需要实现比较灵动…...

软件测试(测试用例详解)(三)

1. 测试用例的概念 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合。 测试环境操作步骤测试数据预取结果 测试用例的评价标准&#xff1a; 用例表达清楚&#xff0c;无二义性。。用例可操作性强。用例的输入与输出明确。一条用例只有…...

最优算法100例之33-字符串/数字的排列组合问题

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 字符串/数字的排列组合问题 void dfs(int deep){if(deep == n){//输出}for(int i = 0; i < n; i++){if(flag[i] == 0){d[d…...

Java面试题:请解释Java中的多线程编程?

Java中的多线程编程允许 concurrently 执行多个线程&#xff0c;从而可以同时执行多个任务&#xff0c;提高程序的效率和响应性。在Java中&#xff0c;线程可以通过以下两种主要方式来实现&#xff1a; 继承 Thread 类实现 Runnable 接口 继承 Thread 类 class MyThread ext…...

acwing算法提高之图论--最小生成树的扩展应用

目录 1 介绍2 训练 1 介绍 本专题用来记录使用最小生成树算法&#xff08;prim或kruskal&#xff09;解决的扩展题目。 2 训练 题目1&#xff1a;1146新的开始 C代码如下&#xff0c; #include <iostream> #include <cstring> #include <algorithm>usin…...

政安晨:【Keras机器学习实践要点】(十七)—— 利用 EfficientNet 通过微调进行图像分类

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 本文目标&#xff1a; 使用 EfficientNet 和在图…...

wordpress全站开发指南-面向开发者及深度用户(全中文实操)--php函数

php函数 wordpress会封装一部分函数&#xff0c;比如bloginfo该函数的作用是直接调用你设置的你的网站的名称 示例 This is our amazing custom theme <?php echo 22; function myfirstfunction(){ echo 33; echo "<p>Hello ,this is my first function</…...

Linux 设备驱动管理之内核对象(Kernel Object)机制

Linux 设备驱动管理之内核对象(Kernel Object)机制 Linux内核是一个复杂的系统&#xff0c;它通过一系列的机制和结构体来管理和表示系统中的资源。其中一个关键的概念是“内核对象”&#xff08;Kernel Object&#xff0c;简称kobject&#xff09;。本文将深入探讨kobject机制…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...