背包九讲——完全背包问题

news2024/11/25 13:19:02

目录

完全背包问题

问题定义

动态规划解法

状态转移方程

初始化

遍历顺序

三种解法:

朴素版——枚举k

进阶版——dp正推(一维滚动数组)


背包问题第三讲——完全背包问题

背包问题是一类经典的组合优化问题,通常涉及在限定容量的背包中选择物品,以最大化某种价值或利益。问题的一般描述是:有一个背包,其容量为C;有一组物品,每个物品有重量w和价值v。目标是选择一些物品放入背包,使得它们的总重量不超过背包容量,同时总价值最大。
完全背包问题则是每个物品都是无限个,而不是只有一个,永远取不完。

完全背包问题

完全背包问题呢,见名知意,就是所谓的物品无限多,选也选不完的那种,是多重背包的promax版本。完全背包问题是背包问题的一种变体,与0/1背包问题有所不同。在完全背包问题中,每种物品的数量是无限的,可以选择任意数量的某一种物品放入背包中。问题的描述如下:
给定一个背包容量为m,有n种物品,每种物品有重量v[i]和价值w[i],且数量无限。目标是选择物品放入背包,使得它们的总重量不超过背包容量,并且总价值最大。
与0/1背包问题相比,完全背包问题的状态转移方程有所不同,因为每种物品可以选择多次。
解决完全背包问题的方法与0/1背包问题类似,可以使用动态规划、贪心算法等。常见的动态规划方法包括自底向上的迭代和自顶向下的递归+记忆化搜索。

问题定义

给定:

  • 一组物品,每个物品有一个重量w[i]和价值v[i],其中i是物品的索引。
  • 一个背包的容量W

目标:

  • 选择一些物品放入背包,使得背包中物品的总价值最大,同时不超过背包的容量。

动态规划解法

动态规划数组dp[j]表示容量为j的背包所能容纳物品的最大价值。

状态转移方程

对于每个物品i,我们有两种选择:

  1. 不选择第i个物品。
  2. 选择第i个物品,由于物品可以无限取用,我们可以取用任意数量的第i个物品。

状态转移方程为:dp[j]=max(dp[j],dp[j−w[i]]+v[i]) 其中j是当前背包的容量,w[i]是第i个物品的重量,v[i]是第i个物品的价值。

初始化
  • dp[0] = 0,因为容量为0的背包没有价值。
遍历顺序
  • 遍历物品,对于每个物品,再遍历背包容量。

三种解法:

既然是promax版本,那还是离不开01背包啊,既然我可以无限选,那就可以选到知道背包装不下为止,就是m/v[i]。

例题就用acwing上的完全背包问题:3. 完全背包问题 - AcWing题库​​​​​​


朴素版——枚举k

最先想到的就是简单的枚举k了吧,把完全背包转换成多重背包,我们的物品是无限多个,但是我们的背包容量是有限的,背包容量有限的话,那么我所能装下的物品就是有限个,每一个物品都有一个限定的值,这个值含义是背包只装第i种物品所能装的最多的个数,我们把所有物品的最大数求出来,那么此题就变成了多重背包问题了,每个物品最多枚举到m/v[i],相当于每个物品的个数确定了,可以利用多重背包的二进制优化或者单调队列优化。

#include<iostream>
using namespace std;
int dp[1005],a[1005];
int n,m;
int v[1005],w[1005];
int main(){
	cin>>m>>n;
	for(int i=1;i<=n;i++){
		cin>>v[i]>>w[i];
	}
	for(int i=1;i<=n;i++){
		for(int j=m;j>=1;j--){
			for(int k=0;k<=j/v[i];k++){
				if(j>=k*v[i]){
					dp[j]=max(dp[j],dp[j-k*v[i]]+k*w[i]);
				}
			}
		}
	}
	cout<<dp[m]<<endl;
	return 0;
}

如果是这样枚举k的朴素版本,那么肯定过不了,时间复杂度太大,考虑优化。


进阶版——dp正推(一维滚动数组)

用一个一维滚动数组,第一个for循环枚举物品个数,第二个for循环去枚举背包容量,枚举的边界为v[i]到m,因为当背包容量>=v[i]的时候,我才能选择第i个物品,后面就是随着第i个物品的个数不断增加,每当一种新的物品加入进来,就意味着数组要滚动一次,在上一个的状态(前i-1种物品)的基础上去更新加入第i个物品的情况,求最优解。

#include<iostream>
using namespace std;
int dp[1005];//dp[i]表示背包容量为i是最大价值
int n,m;//n个物品m背包容量
int v[1005],w[1005];
int main(){
	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=v[i];j<=m;j++){//这里从v[i]到m,保证了能选1——m/v[i](最多)
					dp[j]=max(dp[j],dp[j-v[i]]+w[i]);//状态转移方程
		}
	}
	cout<<dp[m]<<endl;
	return 0;
}

下面解释一下为啥要正序,因为正序的话从小到大更新,在更新的时候状态可以从小的状态转移过来。也就是说在更新dp[i]的时候,i前面的状态(dp[0]---dp[i-1])都被求出来了,那么我们可以利用这一点,当前状态可以从前面已经求出来的状态进行状态转移。

 这样的话时间复杂度大大降低,优化掉了那层k循环,时间复杂度O(nm)

视频讲解这个B站有动画的笔者感觉挺好【信息学奥赛教程】完全背包问题_哔哩哔哩_bilibili

上一篇内容为多重背包问题: 背包九讲——多重背包问题-CSDN博客 


背包问题是经典之经典,每一位算法入门学者必学的内容,里面的优化涉及到的也非常具有思维性,值得大家好好学习。由于笔者水平有限,一些方面可能也存在着问题,望大家理解支持,有错误就指出改正,大家一起进步,执笔至此,感触彼多,全文将至,落笔为终,感谢各位的支持,下篇更新混合背包问题

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

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

相关文章

PCB走线线径与电流关系

转载自一个实验搞明白PCB走线应该画多宽_哔哩哔哩_bilibili

2011年国赛高教杯数学建模A题城市表层土壤重金属污染分析解题全过程文档及程序

2011年国赛高教杯数学建模 A题 城市表层土壤重金属污染分析 随着城市经济的快速发展和城市人口的不断增加&#xff0c;人类活动对城市环境质量的影响日显突出。对城市土壤地质环境异常的查证&#xff0c;以及如何应用查证获得的海量数据资料开展城市环境质量评价&#xff0c;研…

什么是智能电网?

智能电网&#xff08;Smart Grid&#xff09;被认为是当今电力行业发展的重要方向之一。它是传统电网与现代信息技术、通信技术和自动化技术深度融合的产物&#xff0c;旨在提高电力系统的效率、可靠性和可持续性。智能电网不仅仅是一个技术创新的名词&#xff0c;更是一个系统…

全域推广什么意思?如何搭建高效优质的全域推广服务商系统?

当前&#xff0c;全域推广一词的热度日渐升高&#xff0c;越来越多的人开始关注和计划入局这一全新项目&#xff0c;希望能够吃到第一波红利。不过&#xff0c;由于这一项目刚刚兴起&#xff0c;相关资料尚不完善&#xff0c;因此&#xff0c;绝大多数有意向入局的人都对该项目…

创客项目秀 | 基于使用 XIAO BLE Sense 和 Edge Impulse 的宠物活动跟踪器

今天为大家带来的是来自美国的创作者米顿-达斯的作品:宠物活动跟踪器.这个装置主要是为宠物主人提供关于宠物日常活动量的详尽数据&#xff0c;还能够根据宠物的独特需求&#xff0c;提供个性化的健康建议和活动指导。 项目背景 为了全面促进宠物的健康与活力&#xff0c;采用…

来可电子CAN数据记录仪通过智诊小助手TF卡记录文件导出

若想将TF卡中记录的数据文件导出可按以下的流程进行配置&#xff1a; 点击主界面中的导出选项即可进入到下图中TF卡应用界面 点击TF卡应用界面中“查看记录文件”的选项&#xff0c;进入导出文件界面。 点击“选择”进入勾选文件的界面 点击“导出”后&#xff0c;点击“确定”…

Vulnhub打靶-napping

基本信息 靶机下载&#xff1a;https://download.vulnhub.com/napping/napping-1.0.1.ova 攻击机器&#xff1a;192.168.20.128&#xff08;Windows操作系统&#xff09;& 192.168.20.138&#xff08;kali&#xff09; 提示信息&#xff1a;甚至管理员也可以在工作中睡…

统信UOS与Windows11传输数据

原文连接&#xff1a;统信UOS与Windows11相互传输数据 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇统信UOS与Windows11之间通过共享文件夹传输数据的方法&#xff0c;首先在Windows11上创建共享文件夹&#xff0c;然后通过smb协议在UOS上进行连接访问&#xff0c…

彻底解决IDEA SpringBoot项目yml文件没有小树叶,读取配置文件失败问题

报错说没有配置dubbo:application:name,其实是配置了的&#xff0c;就是读不到&#xff0c;那有没有可能是yml文件不是绿叶的问题&#xff1f;网上查了很多文章配置小绿叶&#xff0c;最后还是报这个错&#xff0c;而且网上的文章配置小绿叶也太过于繁琐&#xff0c;其实就一招…

【Java后端】之 ThreadLocal 详解

想象一下&#xff0c;你有一个工具箱&#xff0c;里面放着各种工具。在多人共用这个工具箱的时候&#xff0c;很容易出现混乱&#xff0c;比如有人拿走了你的锤子&#xff0c;或者你找不到合适的螺丝刀。为了避免这种情况&#xff0c;最好的办法就是每个人都有自己独立的工具箱…

Wasm解析入口分析

直接postman请求&#xff0c;发现返回了一个wasm&#xff0c;需要解析这个wasm获取到参数。下面找到页面入口&#xff0c;如下&#xff1a; 也是个VM解析&#xff0c;VM太多了&#xff0c;扣出来就行&#xff0c;不难&#xff0c;就是麻烦的很。

6个最佳核心应用仪表盘构建工具

核心应用仪表盘&#xff08;Core App Dashboard&#xff09;的概念或许你不太熟悉&#xff0c;但仪表盘你一定不陌生。 从汽车的仪表盘显示速度和油量&#xff0c;到运动手环仪表盘追踪步数和心率&#xff0c;再到金融投资仪表盘监控股票和基金的实时行情&#xff0c;它们通过…

Flink窗口分配器WindowAssigner

前言 Flink 数据流经过 keyBy 分组后&#xff0c;下一步就是 WindowAssigner。 WindowAssigner 定义了 stream 中的元素如何被分发到各个窗口&#xff0c;元素可以被分发到一个或多个窗口中&#xff0c;Flink 内置了常用的窗口分配器&#xff0c;包括&#xff1a;tumbling wi…

JAVA线程的多种状态

线程的状态图 new状态&#xff08;新建状态&#xff09;&#xff1a; 创建了一个线程的对象&#xff0c;但是这个线程没有启动start,那么此时这个线程的状态就是NEW也就是新建状态 此时线程对象就是一个普通的JAVA对象&#xff0c;CPU还没有给其分配资源 public class Main16 {…

微信小程序案例:计算器(含代码)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

动态中的守候:滑动窗口与距离的诗篇

公主请阅 1. 长度最小的子数组1.1 题目说明 示例 1 示例 1 示例 2 示例 3 1.2 题目分析1.3 代码部分1.4 代码分析 2. 无重复字符的最长子串2.1 题目说明示例 1示例 1示例 2示例 3 2.2 题目分析2.3 代码部分2.4 代码分析2.5 代码深度分析 1. 长度最小的子数组 题目传送门 1.1 题…

2020年计算机网络408真题解析

第一题&#xff1a; 解析&#xff1a;OSI参考模型网络协议的三要素 网络协议的三要素&#xff1a;语法 &#xff0c;语义&#xff0c;同步&#xff08;时序&#xff09; 语法&#xff1a;定义收发双方所交换信息的格式 语法&#xff1a;定义收发双方所要完成的操作 网页的加载 …

「iOS」——YYModel学习

iOS学习 前言优势使用方法简单的Model与JSON互转多样化的数据类型交换容器类数据交换 model中包含其他model白名单与黑名单 总结 前言 YYModel是YYKit的高效组件之一&#xff0c;在实际场景中的非常实用&#xff0c;在项目中使用MVC架构时&#xff0c;可以简化数据处理。在性能…

Tailwind Starter Kit 一款极简的前端快速启动模板

Tailwind Starter Kit 是基于TailwindCSS实现的一款开源的、使用简单的极简模板扩展。会用Tailwincss就可以快速入手使用。Tailwind Starter Kit 是免费开源的。它不会在原始的TailwindCSS框架中更改或添加任何CSS。它具有多个HTML元素&#xff0c;并附带了ReactJS、Vue和Angul…

tensorflow c++ api + windwos + vs部署 详细避坑

文章目录 前言一、安装MSYS2二、选择tensorflow的版本三、安装Bazel四、配置一个anconda的tensorflow环境五、生成dll,lib,include六、在vs2019中配置项目七、测试并针对性修补问题 前言 不能使用vs2022配置tensorflow c api&#xff0c;即使要安装 2.10.0版本&#xff0c;也尽…