python 基础知识点(蓝桥杯python科目个人复习计划44)

今日复习内容:做真题 + 复习动态规划

完全背包问题是背包问题的一个重要变体。

1.问题描述

给定一个背包,容量为C,一组物品,每个物品有自己的重量wi和价值vi,完全背包问题要求在不超过背包容量的情况下,放入物品的总价值最大。

2.动态规划解法

使用动态规划是解决完全背包问题的常用方法。定义状态dp[i][j]表示前i个物品,在背包容量为j时能够获得的最大价值。

状态转移方程为dp[i][j] = max(dp[i - 1][j],dp[i][j - wi] + vi)

这里的状态转移方程与0-1背包类似,但不同之处在于在计算第i个物品时,背包容量可以多次减去wi。

3.时间复杂度

动态规划解法的时间复杂度为O(NC),其中N是物品的数量,C是背包的容量。因为对于每个物品和每个背包容量都需要计算状态,所以是一个二维的动态规划问题。

例题1:小明的背包2

题目描述:

小明有一个容量为V的背包。

这天他去商场购物,商场一共有N种物品,第i种物品的体积为wi,价值为vi,每种物品都有无限多个。

小明想知道在购买的物品总体积不超过V的情况下所能获得的最大价值是多少,请你帮他算算。

输入描述:

输入第一行包含两个正整数N和V,表示商场的物品数量和小明的背包容量。

第2至N + 1行包含两个正整数w和v,表示物品的体积和价值。

1 <= N <= 10^3,1 <= V <= 10^3,1 <= wi,vi <= 10^3.

输出描述:

输出一行整数表示小明所能获得的最大价值。

参考答案:

N,V = map(int,input().split())
dp = [[0] * (V + 1) for i in range(N + 1)]for i in range(1,N + 1):w,v = map(int,input().split())for j in range(V + 1):if j < w:dp[i][j] = dp[i - 1][j]else:dp[i][j] = max(dp[i - 1][j],dp[i][j - w] + v)print(dp[N][V])

运行结果:

我还可以把它优化一下:

N,V = map(int,input().split())
dp = [0] * (V + 1)
for i in range(1,N + 1):w,v = map(int,input().split())for j in range(w,V + 1):dp[j] = max(dp[j],dp[j - w] + v)print(dp[V])

多重背包问题是背包问题的另一种变体,与0-1背包问题和完全背包问题不同,多重背包问题允许每种物品放入背包的数量有限制。

1.问题描述

给定一个容量为C的背包,一组物品,每个物品都有自己的重量wi,价值vi和数量限制ni,多重背包问题要求在不超过背包容量的情况下,放入物品的总价值最大。

2.动态规划解法

多重背包问题也可以使用动态规划来解决,但相比于完全背包问题,状态转移方程需要更多的考虑。

定义状态dp[i][j]表示前i个物品,在背包容量为j时能够获得的最大价值。

状态转移方程为dp[i][j] = max(dp[i - 1][j - k * wi] + k * vi),其中k的取值范围是 0 <= k <= ni,表示第i个物品放入背包的数量。

例题2:小明的背包3

题目描述:

小明有一个容量为V的背包。

这天他去商场购物,商场一共有N件商品,第i件物品的体积为wi,价值为vi,数量为si。

小明想知道在购买的物品的总体积不超过V的情况下所能获得的最大价值是多少,请你帮他算算。

输入描述:

输入第一行包含两个正整数N,V,表示商场的商品数量和背包容量。

第2至N + 1 行包含三个正整数w,v,s,表示物品的体积和价值。

1 <= N <= 10^2,1 <= V <= 2 * 10^2,1 <= wi,vi,si <= 2 * 10^2

输出描述:

输出一行整数表示小明所能获得的最大价值。

参考答案:

N,V = map(int,input().split())
dp = [[0] * (V + 1) for i in range(N + 1)]
for i in range(1,N + 1):w,v,s = map(int,input().split())for j in range(V + 1):for k in range(min(s,j // w) + 1):dp[i][j] = max(dp[i][j],dp[i - 1][j - k * w] + k * v)print(dp[N][V])

运行结果:

二维费用背包问题是背包问题的一个扩展,与经典的0-1背包问题,完全背包问题和多重背包问题不同,它增加了物品的两个维度的费用。

1.问题描述

给定一个背包容量C,一组物品,每个物品具有两个维度的费用wi和ci,以及对应的价值vi。二维费用背包问题要求在不超过背包容量的情况下,放入物品的总价值最大。

2.动态规划解法

二维费用背包问题可以用动态规划来解决。定义状态dp[i][j][k]表示前i个物品,在背包容量为j时和第二维费用为k时获得的最大价值。

状态转移方程为dp[i][j][k] = max(dp[i - 1][j][k],dp[i - 1][j - wi][k - ci] + vi)

这里的状态转移方程表示在选择放入第i个物品时,可以选择放入或不放入,并考虑背包容量和第二维费用的限制。

3.时间复杂度

动态规划解法的时间复杂度是O(NCM),其中N是物品的数量,C是背包容量的上限,M是第二维费用的上限。因为需要考虑每个物品,每个背包容量和每个第二维费用的情况,所以是一个三维的动态规划问题。

例题3:小蓝的神秘行囊

题目描述:

小蓝是一名著名的探险家,他即将踏上一场寻宝的冒险旅程,他的目的是寻找和收集各种神秘的宝物。他有一个神秘的行囊,能够装载各种物品。然而,这个行囊有一个特殊的规定:它的最大容量是V,并且他能承载的最大重量是M。

小蓝来到一个古老的城堡,里面有N件神秘的宝物,每件宝物只能被取走一次,每件宝物都有特定的体积vi,重量mi和价值wi。

面对眼前的宝物,小蓝需要做出决定:将哪些宝物放入他的行囊,使得宝物的总体积不超过行囊的体积,总重量不超过行囊的最大承重量,且价值总和最大。

你的任务是帮助小蓝决定应该选择哪些宝物,并输出这些宝物的最大价值和。

输入描述:

第一行是3个正整数N,V,M,用空格隔开,分别表示宝物的数量,行囊的容量和行囊所能承载的最大重量。

接下来的N行,每行有3个整数vi,mi,wi,用空格隔开,分别表示每个宝物的体积,重量和价值。

数据范围保证:0 < N <= 1000,0 < V,M <= 100,0 < vi,wi <= 100,0 < wi <= 1000。

输出格式:

输出一个整数,表示可以装入行囊的宝物的最大总价值。

参考答案:

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

运行结果:

分组背包是背包问题的一种变体,与0-1背包问题,完全背包问题等有所不同。在分组背包问题中,物品被视为若干组,每组中的物品只能选择一个放入背包。

1.问题描述

给定一个容量为C的背包,若干组物品,每组中的物品有自己的重量wi和价值vi,每组物品只能选择一个放入背包。分组背包问题要求在不超过背包容量的情况下,放入背包的总价值最大。

2.动态规划解法

分组背包问题同样可以使用动态规划来解决。定义dp[i][j]表示前i组物品,在背包容量为j时能够获得的最大价值。

价值转移方程为:

dp[i][j]=max(dp[i−1][j],max(k=1到ni)​​dp[i−1][j−wi,k​]+vi,k​)

其中ni表示第i组物品的数量,wi,k表示第i组中第k个物品的重量,vi,k表示第i组中第k个物品的价值。

3.时间复杂度

动态规划的时间复杂度是O(GC),其中G是组数,C是背包的容量。因为需要考虑每组物品和每个背包容量的情况,所以是一个二维的动态规划问题。

例题4:小明的背包5

题目描述:

小明有一个容量为V的背包。

这天他去商场购物,商场一共有N组物品,第i组里有si件物品,物品的体积为w,价值为v,对于每一组只能购买一件物品。

小明想知道在购买的物品总体积不超过V的条件下所能获得的最大价值是多少,请你帮他算算。

输入描述:

输入第一行包含两个正整数N和V,表示商场物品的数量和小明背包的容量。

接下来有N组数据,对于每组数据的输入如下:

第一行输入一个整数s,表示该组的物品个数;

接下来s行每行包含两个整数w,v,表示物品的体积和价值。

 1 <= N,V <= 10^2,1 <= s <= 10^2,1 <= w,v <= 10^3

输出描述:

输出一行整数表示小明所能获得的最大价值。

参考答案:

N,V = map(int,input().split())
dp = [[0] * (V + 1) for i in range(N + 1)]
for i in range(1,N + 1):s = int(input())for _ in range(s):w,v = map(int,input().split())for j in range(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])

运行结果:

 

OK,这篇就写到这里,我得加快一点复习速度了,下一篇继续!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/475344.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于51/STM32单片机的智能药盒 物联网定时吃药 药品分类

功能介绍 以51/STM32单片机作为主控系统&#xff1b; LCD1602液晶显示当前时间、温湿度、药品重量 3次吃药时间、药品类目和药品数量 HX711压力采集当前药品重量 红外感应当前药盒是否打开 DS1302时钟芯片显示当前年月日、时分秒、星期 DHT11采集当前环境温度和湿度 …

反射的作用

获取一个类里面所有的信息&#xff0c;获取到了之后&#xff0c;再执行其他的业务逻辑结合配置文件&#xff0c;动态的创建对象并调用方法 练习1&#xff1a; public class MyTest {public static void main(String[] args) throws IllegalAccessException, IOException {Stude…

SQL25 查找山东大学或者性别为男生的信息(union用法)

代码 select device_id , gender , age , gpa from user_profile where university 山东大学 UNION ALL select device_id , gender , age , gpa from user_profile where gender male知识点 在使用 Union 时&#xff0c;如果不需要删除重复行&#xff0c;或者结果集中的重…

EXCEL中不错的xlookup函数

excel中一般要经常用vlookup函数&#xff0c;但其实经常麻烦要正序&#xff0c;从左边到右边&#xff0c;还要数列&#xff0c;挺麻烦的&#xff0c;xlookup的函数还不错&#xff0c;有个不错的一套视频介绍,B站的&#xff0c;地址是&#xff1a;XLOOKUP函数基础用法&#xff0…

【OpenAI Sora】怎么启用:详细教程与使用指南(OpenAI Sora怎么启用)

OpenAI Sora的启用方法&#xff1a;详细教程与使用指南 OpenAI Sora是一种新的AI大模型&#xff0c;可以根据简单的文本提示生成逼真和富有想象力的60秒视频。用户可以通过以下步骤启用OpenAI Sora&#xff1a; 最新消息&#xff1a;本文是设想的方式&#xff0c;但 Sora 目前…

Redis:常用数据类型及其应用场景

Redis中常见的数据类型有五种&#xff1a;String&#xff08;字符串&#xff09;&#xff0c;Hash&#xff08;哈希&#xff09;&#xff0c;List&#xff08;列表&#xff09;&#xff0c;Set&#xff08;集合&#xff09;、Zset&#xff08;有序集合&#xff09;。下面我来分…

【快速解决】python项目打包成exe文件——vscode软件

目录 操作步骤 1、打开VSCode并打开你的Python项目。 2、在VSCode终端中安装pyinstaller&#xff1a; 3、运行以下命令使用pyinstaller将Python项目打包成exe文件&#xff1a; 其中your_script.py是你的Python脚本的文件名。 4、打包完成后&#xff0c;在你的项目目录中会…

js设计模式:中介者模式

作用: 通过一个公共的对象,去处理不同对象之间的消息传递。 就好比两个用户用微信聊天,微信就是中介者,负责两个人消息的接收与分发。 示例: const Weixin {msgList:[],//添加用户addUser(user){this.msgList.push(user)},//转发消息transmit(msgId,msg,name){this.msgList…

go redis

go redis 快速入门 安装&#xff1a; go get github.com/redis/go-redis/v9然后创建客户端&#xff1a; package mainimport "github.com/redis/go-redis/v9"func main() {rdb : redis.NewClient(&redis.Options{Addr: "47.109.87.142:6379",Pa…

vcruntime140.dll文件下载的多种方案分享,最新下载安装方法解析

安装或运行软件时常遇到缺失系统文件的相关问题&#xff0c;一个典型的例子是vcruntime140.dll​丢失错误&#xff0c;这种情况经常发生在运行那些基于Visual Studio 2015开发的应用上。缺乏这个文件的提示可能会严重拖慢程序的响应速度&#xff0c;并有可能阻碍用户使用受影响…

spring boot自动装配

第一步需要在pom.xml文件指定需要导入的坐标 要是没有自动提示需要检查maven有没有 实现代码 /*springboot第三方自动配置实现方法 * 什么是自动配置 自动配置就是springboot启动自动加载的类不需要在手动的控制反转自动的加入bean中 * * *//*第一种方案包扫描 不推荐因为繁琐…

sensitive-word-admin v1.3.0 发布 如何支持敏感词控台分布式部署?

拓展阅读 sensitive-word-admin v1.3.0 发布 如何支持分布式部署&#xff1f; sensitive-word-admin 敏感词控台 v1.2.0 版本开源 sensitive-word 基于 DFA 算法实现的高性能敏感词工具介绍 更多技术交流 业务背景 如果我们的敏感词部署之后&#xff0c;不会变化&#xff0c;那…