01背包笔记

news2024/9/23 17:17:35

01背包题目链接

题意:有一个容量为m的背包以及n个可以拿的物品,给出n个物品的体积和价值,要求输出可以拿的最大价值

思路:dp[i][j]代表在前i件物品中拿取总体积不超过j的最大价值

由此可以分情况讨论状态转移

当j<v[i]时,说明当前枚举的重量本身就不足以拿取当前物品,则dp[i][j]=dp[i-1][j]

如果j>v[i],则分为拿当前物品和不拿当前物品

如果拿,则有dp[i][j]=dp[i-1][j-v[i]]+w[i]

如果不拿,则有dp[i][j]=dp[i-1][j]

ac代码:

#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define INF 0x3f3f3f3f
#define pb push_back
#define int long long
#define Mirai ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
typedef pair<int,int> pii;
const int N=1010;
int v[N];
int w[N];
int dp[N][N];
int n,m;
void solve()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>v[i]>>w[i];//依次读入每个物品的价值和重量
	for(int i=1;i<=n;i++)//遍历拿前i件物品
	{
		for(int j=0;j<=m;j++)//遍历最大容量j
		{
		    if(j<v[i])dp[i][j]=dp[i-1][j];//当前容量不足以拿当前物品
			else dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);
		}
	}
	cout<<dp[n][m]<<endl;

}
signed main()
{
	Mirai;
	int T=1;
	//cin>>T;
	while(T--)
	{
		solve();
	}
}

一维优化:

不难发现,更新选前i件物品时,状态转移所需要的状态只来自i-1,所以完全可以不必将所有状态全部保存下来,只需要将数组开到一维即可

优化后的状态转移方程为:

if(j<v[i])dp[j]=dp[j];
else dp[j]=max(dp[j],dp[j-v[i]]+w[i]);

其中,dp[j]更新状态所需要的状态是未更新的左边的值,这就要求我们在更新j的时候其中小于j的值是保证不能被更新的,所以我们需要从大到小进行遍历,而其中j<v[i]的部分的值是直接保留的,所以可以将遍历范围规定到(m~v[i])

ac代码:

#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define INF 0x3f3f3f3f
#define pb push_back
#define int long long
#define Mirai ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
typedef pair<int,int> pii;
const int N=1010;
int v[N];
int w[N];
int dp[N];
int n,m;
void solve()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>v[i]>>w[i];
	for(int i=1;i<=n;i++)
	{
		for(int j=m;j>=v[i];j--)
		{
			dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
		}
	}
	cout<<dp[m]<<endl;
}
signed main()
{
	Mirai;
	int T=1;
	//cin>>T;
	while(T--)
	{
		solve();
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【总结】p50蓝图概念、面向对象思想、函数事件宏的区别

p50蓝图概念、面向对象思想、函数事件宏的区别 函数的概念&#xff08;纯虚函数和函数&#xff09;宏的概念函数、事件、宏的区别变量的概念面向对象思想&#xff08;封装、继承、多态&#xff09;类和对象的关系Object、actor、pawn、Character、component之间的区别控制权、玩…

RTT(RT-Thread)时钟管理

目录 时钟管理 时钟节拍 RTT工程目录结构介绍 配置文件&#xff1a;rtconfig.h 获取系统节拍 获取系统节拍数函数 实例 定时器 RT_Thread定时器介绍 定时器源码分析&#xff08;了解即可&#xff09; rt_system_timer_init (硬件定时器初始化) rt_system_timer_thr…

python文件与目录操作

目录 文件编码 文件的读取 打开文件 mode常用的三种基础访问模式 读取文件 关闭文件 with open语法 文件的写入操作 文件综合案例 a.txt内容 代码实现 b.txt文件 目录操作 前言 os模块 具体方法 os.path模块 具体方法 文件编码 前言&#xff1a;由于计算机…

【在英伟达nvidia的jetson-orin-nx上使用调试can基础收发-硬件连接-开机自启动can-初步调试】

【在英伟达nvidia的jetson-orin-nx上使用调试can基础收发-硬件连接-开机自启动can-初步调试】 1、概述2、实验环境3、自我学习4-1、实验过程1、硬件原理图焊接连接模块2、输入命令3、测试过程 4-2、目前遗留问题# 1-1、发送可以发送&#xff0c;但是PC发送数据收不到。# 1-2、接…

任务 13、MidJourney种子激发极致创作,绘制震撼连贯画作

13.1 任务概述 通过本次实验任务&#xff0c;学员将深入了解Midjourney种子的概念和重要性&#xff0c;以及种子对生成图像的影响。他们将学会在Midjourney平台中设置种子值并调整其参数&#xff0c;以达到所需的效果。此外&#xff0c;任务还详细介绍了Midjourney V4.0版本中…

周末作业 c高级

1.判断家目录下&#xff0c;普通文件的个数和目录文件的个数&#xff1a; #!/bin/bash arr1(ls -la ~/|cut -d r -f 1|grep -wi d) arr2(ls -la ~/|cut -d r -f 1|grep -wi -)echo "普通文件个数为&#xff1a;${#arr2[*]}" echo "目录文件个数为&#xff1a;$…

【TypeScript】TS接口interface类型(三)

【TypeScript】TS接口interface类型&#xff08;三&#xff09; 【TypeScript】TS接口interface类型&#xff08;三&#xff09;一、接口类型二、实践使用2.1 常规类型2.2 设置属性只读 readonly2.3 设置索引签名2.4 设置可选属性2.5 函数类型接口 一、接口类型 TypeScript中的…

没有配置redis但是报错连接redis失败

问题 没有配置redis但是报错连接redis失败 检查maven配置是否引入了redis依赖&#xff08;可能是传递依赖&#xff0c;最好检查引进来的公共工程 解决办法 只需要在该工程application.yml文件中配置一下 redis就好&#xff0c;或者移除redis依赖

高效处理矢量大数据的高可用解决方案

高效处理矢量大数据的高可用解决方案 解决方案目标 存储海量矢量数据实时分析海量矢量数据实现海量矢量数据的可视化提供高可用、高性能和高可拓展性解决方案概述 海量数据查询与可视化 系统技术流程 方案一 数据存储: PostgreSQL+PostGIS(矢量数据存储和空间分析)数据服务…

企业场景--技术场景

目录 单点登录如何实现 使用jwt解决单点登录 总结 ​编辑 权限认证如何实现 五张表实现权限认证 框架 具体案例 上传数据的安全性如何控制 对称加密 非对称加密 你的项目遇到了哪些棘手的问题&#xff1f; 项目中日志怎么采集的 ELK进行日志采集 logstash kibana操…

P25LED透明屏:在商业广告中,透明显示效果怎么样?

P25LED透明屏是一种新型的显示屏技术&#xff0c;它具有高透明度和高亮度的特点&#xff0c;可以实现透明显示效果。 P25LED透明屏广泛应用于商业广告、展览展示、户外广告等领域&#xff0c;具有很大的市场潜力。 P25LED透明屏采用了先进的LED显示技术&#xff0c;具有高亮度…

浅析RabbitMQ死信队列

原文首发于公众号【CSJerry】 在现代分布式系统中&#xff0c;消息队列扮演着至关重要的角色。它们可以实现应用程序之间的异步通信&#xff0c;并确保数据的可靠传输和处理。而在这个领域中&#xff0c;RabbitMQ作为一种强大而受欢迎的消息队列解决方案&#xff0c;具备了高…

c语言——求n之内的素数和

//求n之内的素数和 //列如&#xff1a;2、3、5等 #include<stdio.h> #include<math.h> int main() {int i,j,k,n0;scanf("%d",&n);for(i2;i<n;i){k(int)sqrt(i);for(j2;j<k;j)if(i%j0)break;if(j>k){printf("%d,",i);n;if(n%50)p…

23.8.5总结(Web博客项目)

用户搜索&#xff0c;标签搜索。 主页面加上了标签和用户推荐 管理员页面还需要修改 还有这些功能点没有实现&#xff1a; 右键删除评论 点赞次数已达上限 删除博客 消息页面&#xff0c;收消息&#xff08;点赞和收藏要给被点赞这个博主发消息&#xff09; 管理员页面&#…

day52-Redis

Redis 1.Redis 1.1 RESP连接Redis 1.2 定义&#xff1a;是一个高性能的key-value数据库&#xff08;非关系型数据库&#xff09; 1.3 数据类型&#xff1a; key键的类型是字符串类型&#xff1b; 值的类型有五种&#xff1a;字符串String&#xff0c;哈希hash&#xff0…

layui之layer弹出层的icon数字及效果展示

layer的icon样式 icon如果在信息提示弹出层值(type为0)可以传入0-6&#xff0c;icon与图标对应关系如下&#xff1a; 如果是加载层&#xff08;type为3&#xff09;可以传入0-2&#xff0c;icon与图标对应关系如下&#xff1a;

javaAPI(五):System、Math、BigInteger、BigDecimal

System类 System类代表系统&#xff0c;系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。 由于该类的构造器是private的&#xff0c;所以无法创建该类的对象&#xff0c;也就是无法实例化该类。其内部的成员&#xff0c;所以也可以很方便的进行调用。变量…

STM32入门学习之独立看门狗(IWDG)

1.STM32的独立看门狗是一个具有独立时钟的片上外设。通常&#xff0c;为了防止程序卡死&#xff0c;可以设置看门狗定时复位。当看看门狗被使能之后&#xff0c;会按初始化时设置的计数值进行计数。当根据计数值计数的倒数时间为0时&#xff0c;便会自动复位程序&#xff0c;即…

嵌入式开发学习(STC51-12-I2C/IIC)

内容 在数码管右3位显示数字&#xff0c;从0开始&#xff0c;按K1键将数据写入到EEPROM内保存&#xff0c;按K2键读取EEPROM内保存的数据&#xff0c;按K3键显示数据加1&#xff0c;按K4键显示数据清零&#xff0c;最大能写入的数据是255&#xff1b; I2C介绍 I2C简介 I2C&…

CNN成长路:从AlexNet到EfficientNet(01)

一、说明 在 10年的深度学习中&#xff0c;进步是多么迅速&#xff01;早在 2012 年&#xff0c;Alexnet 在 ImageNet 上的准确率就达到了 63.3% 的 Top-1。现在&#xff0c;我们超过90%的EfficientNet架构和师生训练&#xff08;teacher-student&#xff09;。 如果我们在 Ima…