限量背包问题

news2024/11/23 3:46:51

问题描述

限量背包问题:从m个物品中挑选出最多v个物品放入容量为n的背包。

问题分析

限量背包问题,可以用来解决许多问题,例如要求从n个物品中挑选出最多v个物品放入容量为m的背包使得背包最后的价值最大,或者总共有多少种放法使得背包满载即组合数问题,又或者排列数问题。为了更好理解限量背包问题,我们先来回顾一下物品不限量的背包问题的滚动数组是如何写的。
01背包问题(物品每个只能选一次)

for(int i = 0; i < weight.size(); i++) { // 遍历物品
    for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量
        dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
    }
}

完全背包问题(物品每个可选多次)

for(int i = 0; i < weight.size(); i++) { // 遍历物品
	for(int j=weight[i];j<=bagWeight[i];j++){// 遍历背包容量
        dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
    }
}

从上面我们可以知道,如果物品只能选一次,则遍历背包容量从后往前,如果物品可以选多次,则遍历背包容量从前往后。

背包求组合数问题(从n个物品中选择放满背包有多少种组合)

dp[0]=1;
for(int i=0;i<n;i++){ // 遍历物品
    for(int j=w[i];j<=m;j++){// 遍历背包容量
        dp[j]+=dp[j-w[i]];
    }
}

背包求排列数问题(从n个物品中选择放满背包有多少种排列)

dp[0]=1;
for(int j=1;j<=m;j++){ // 遍历物品
    for(int i=0;i<n;i++){// 遍历背包容量
    	if(j>=w[i])
        dp[j]+=dp[j-w[i]];
    }
}

从上面我们又能知道,如果是求组合问题则是先遍历物品再遍历背包,如果是求排列问题则是先遍历背包再遍历物品。

回顾了以上这些知识点,接下来我们开始讲解限量背包的各种问题。限量背包相较于不限量背包不过是多了一层循环,和dp数组多了一个维度。多出来的这一个维度值i,表示选了i个物品的背包。如果要求从m个物品中挑选出最多v个物品放入容量为n的背包,则将1~v的dp数组值累加即可。

限量背包的各种问题

限量背包的01背包问题(物品每个只能选一次)

vector<vector<int> > dp(bagWeight+1,vector<int>(v+1,0));//v:最多可以放入v个物品
for(int i = 0; i < weight.size(); i++) { // 遍历物品
    for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量
    	for(int k=1;k<=v;k++)//遍历每一个选择数量
    		dp[j][k]=max(dp[j][k],dp[j - weight[i]][k-1] + value[i]);//放入该物品与不放入该物品
    }
}

限量背包的完全背包问题(物品每个可选多次)

vector<vector<int> > dp(bagWeight+1,vector<int>(v+1,0));//v:最多可以放入v个物品
for(int i = 0; i < weight.size(); i++) { // 遍历物品
    for(int j=weight[i];j<=bagWeight[i];j++){ // 遍历背包容量
    	for(int k=1;k<=v;k++)//遍历每一个选择数量
    		dp[j][k]=max(dp[j][k],dp[j - weight[i]][k-1] + value[i]);//放入该物品与不放入该物品
    }
}

限量背包求组合数问题(从n个物品中选择放满背包有多少种组合,物品可选多次)

vector<vector<int> > dp(n+1,vector<int>(v+1,0));//v:最多可以放入v个物品
dp[0][0]=1;
	for(int i=0;i<m;i++){//遍历每个物品 
		for(int j=w[i];j<=n;j++){//遍历体积,从前往后遍历 
			for(int k=1;k<=v;k++){//遍历每一个选择数量
				dp[j][k]+=dp[j-w[i]][k-1];
			}
		}
	}

限量背包求组合数问题(从n个物品中选择放满背包有多少种组合,物品只能选一次)

vector<vector<int> > dp(n+1,vector<int>(v+1,0));//v:最多可以放入v个物品
dp[0][0]=1;
	for(int i=0;i<m;i++){//遍历每个物品 
		for(int j=n;j>=w[i];j--){//遍历体积,从后往前遍历 
			for(int k=1;k<=v;k++){//遍历每一个选择数量
				dp[j][k]+=dp[j-w[i]][k-1];
			}
		}
	}

限量背包求排列数问题(从n个物品中选择放满背包有多少种排列,物品可选多次)

vector<vector<int> > dp(n+1,vector<int>(v+1,0));//v:最多可以放入v个物品
	dp[0][0]=1;
	for(int j=1;j<=n;j++){//遍历体积 
		for(int i=0;i<m;i++){//遍历每个物品 
			for(int k=1;k<=v;k++){//遍历每一个选择数量
				if(j>=w[i])
				dp[j][k]+=dp[j-w[i]][k-1];
			}
		}
	}

限量背包求排列数问题(从n个物品中选择放满背包有多少种排列,物品只能选一次)很多同学看到这里肯定会想,既然知道了前面限量背包求排列数问题(物品可选多次)怎么写,那么这里是不是只需要将遍历体积的顺序改为从后往前就行了呢?答案是错误的。我这里给出一个测试结果
输入
第一行输入背包容量10,物品种类3,总选物品限量10
第二行输入每个物品的体积
输出
输出10行,第i行表示选i个物品的满载背包的选法的排列数。

在这里插入图片描述
可以看到,第一行是对的,表示只选一个物品的背包的排列数,但是后面的全为0,这显然是错误的。那么应该如何解决这个问题呢?白丁暂时未能解决这个问题。如果有知道怎么写的大佬,欢迎发在评论区让我们学习学习。

限量背包的实际应用

2022——蓝桥杯十三届2022国赛大学B组真题

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

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

相关文章

先进制造业数字化转型,为什么基于传统存储无法完成?

本文是 XSKY 智能存储方案助力先进制造数字化转型系列文章中的第一篇&#xff0c;重点分享先进制造行业数字化转型过程中&#xff0c;对于数据存储的需求&#xff0c;以及为何传统存储架构无法很好满足这些需求。 随着智能制造的发展&#xff0c;自动化、信息化、智能化等技术…

unity基础(二)

debug方法 Debug.Log(" 一般日志 ");Debug.LogWarning(" 警告日志 ");Debug.LogError(" 错误日志 ");// Player Informationstring strPlayerName "Peter";int iPlayerHpValue 32500;short shPlayerLevel 10;long lAdvantureExp 1…

k8s部署Kubeflow v1.7.0

文章目录 环境介绍部署访问kubeflow ui问题记录 环境介绍 K8S版本&#xff1a;v1.23.17&#xff0c;需要配置默认的sc 参考&#xff1a;https://github.com/kubeflow/manifests/tree/v1.7.0 部署 #获取安装包 wget https://github.com/kubeflow/manifests/archive/refs/tag…

【方法】如何创建RAR格式压缩文件?

为了方便存储或者传输文件&#xff0c;我们经常会把文件打包成不同格式的压缩包&#xff0c;那如果想创建的是RAR格式的压缩包&#xff0c;要如何做呢&#xff1f; RAR是WinRAR软件独有的压缩格式&#xff0c;所以我们可以通过WinRAR软件来创建RAR格式压缩包。下面分享两种创建…

5000亿参数来了:微软将推出 MAI-1 模型硬刚谷歌和OpenAI|TodayAI

美国的科技巨头微软公司&#xff0c;正在积极扩展其人工智能&#xff08;AI&#xff09;技术的领域。最新消息显示&#xff0c;微软将推出一款名为MAI-1的全新AI模型&#xff0c;其规模巨大&#xff0c;预计将拥有5000亿个可调参数。这一开发工作由Inflection AI的CEO穆斯塔法苏…

cmake进阶:变量的作用域说明三(从函数作用域方面)

一. 简介 前一篇文章从函数作用域方面学习了 变量的作用域。文章如下&#xff1a; cmake进阶&#xff1a;变量的作用域说明一&#xff08;从函数作用域方面&#xff09;-CSDN博客cmake进阶&#xff1a;变量的作用域说明二&#xff08;从函数作用域方面&#xff09;-CSDN博客…

在Node.js(express 框架)中使用 JWT 进行身份认证

文章目录 一、JWT 认证机制二、安装 JWT 相关的包三、基本使用1、生成 JWT 字符串2、添加中间件&#xff0c;解析 JWT 字符串3、获取管理员信息(admin) 一、JWT 认证机制 JWT 认证机制&#xff08;图片来源于网络&#xff0c;侵权删除&#xff09;&#xff1a; 关于 JWT 原理可…

Wish、Newegg、Allegro卖家如何做测评补单 快速提升产品权重与销量

大部分主流平台卖家都会使用测评补单来增加产品权重、提高销量。经常会有一些平台的卖家咨询我其他平台能否像亚马逊一样通过测评补单来提升曝光。 其实大部分跨境电商都是可以通过补单来增加店铺权重提升产品排名。其实亚马逊相对来说风控是最严的&#xff0c;风控点多达几十…

Pytorch基础:内置类type的用法

相关阅读 Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 在python中&#xff0c;一切数据类型都是对象&#xff08;即类的实例&#xff09;&#xff0c;包括整数、浮点数、字符串、列表、元组、集合、字典、复数、布尔、函数、…

Telnet的三种配置和SSH配置

Telnet的三种配置 实验配置思路&#xff1a; 配置接口IP地址&#xff1a; R1——配置接口IP地址 R2——配置接口IP地址 认证模式为none的配置 R1——认证模式配置为none R2——测试Telnet连接R1设备 认证模式为passwrd的配置 R1——认证模式配置为password R2——测试Telnet连…

C语言例题35、判断一个数是否是回文数

题目要求&#xff1a;输入一个5位数&#xff0c;判断它是不是回文数。即12321是回文数 #include <stdio.h>int main() {int x;int ge, shi, qian, wan;printf("请输入一个5位数&#xff1a;");scanf("%d", &x);ge x % 10; //个sh…

嵌入式硬件中PCB走线与过孔的电流承载能力分析

简介 使用FR4敷铜板PCBA上各个器件之间的电气连接是通过其各层敷着的铜箔走线和过孔来实现的。 由于不同产品、不同模块电流大小不同,为实现各个功能,设计人员需要知道所设计的走线和过孔能否承载相应的电流,以实现产品的功能,防止过流时产品烧毁。 文中介绍设计和测试FR4敷…

图解HTTP(2、简单的 HTTP 协议)

HTTP 协议用于客户端和服务器端之间的通信 请求访问文本或图像等资源的一端称为客户端&#xff0c;而提供资源响应的一端称为服务器端。 通过请求和响应的交换达成通信 请求必定由客户端发出&#xff0c;而服务器端回复响应报文 请求报文是由请求方法、请求 URI、协议版本、…

Baidu Comate 智能编码助手:编程新伙伴,效率新飞跃

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 目录 写在前面 一、Baidu Comate智能编码助手简介…

vue快速入门(五十七) 作用域插槽

注释很详细&#xff0c;直接上代码 上一篇 新增内容 作用域插槽实现表格删除数据 源码 App.vue <template><div id"app"><!-- 向子组件传值 --><MyTable :tableData"tableData"><!-- 接收子组件的传值&#xff0c;默认是对象格…

金三银四面试题(二十四):享元模式知多少?

什么是享元模式 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在通过共享对象来减少内存使用&#xff0c;从而提高性能。它主要用于处理大量细粒度对象的情况&#xff0c;通过将这些对象的可共享部分&#xff08;内部状态&#xff09…

“A”分考试经验分享:云计算HCIE考试请注意这几点...

大家好&#xff0c;我是誉天云计算HCIE的王同学&#xff0c;于4月2日"A"分通过了云计算3.0 HCIE的认证考试。 首先感谢誉天教育对我的辅导&#xff0c;感谢苗苗老师和石老师对我的帮助&#xff0c;通过这次考试让我对华为云计算有了一定的了解。接下来我就与大家分享…

嵌入式C语言教程:实现气压监测系统

气压监测在气象学、航空和户外活动装备中非常重要。本教程将介绍如何在STM32微控制器上使用数字气压传感器实现实时气压监测系统。 一、开发环境准备 硬件要求 微控制器&#xff1a;STM32L476RG&#xff0c;具备低功耗特性和足够的处理能力。开发板&#xff1a;STM32L4 Disc…

“40法则”视角下的中国网络安全公司

“40法则”视角下国内网安上市公司2023年业绩表现 采用“40法则”衡量&#xff0c;首先需要考虑的是营收增长和利润水平的衡量指标&#xff0c;在上一篇文章中已经详细说明&#xff0c;在此不再赘述。 增长速度的衡量指标&#xff0c;可以选择公司的营业收入的同比增长率。 …

软考 系统架构设计师系列知识点之软件可靠性基础知识(11)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之软件可靠性基础知识&#xff08;10&#xff09; 所属章节&#xff1a; 第9章. 软件可靠性基础知识 第2节 软件可靠性建模 9.2.3 软件可靠性模型模型分类 一个有效的软件可靠性模型应尽可能地将前文所述的因素在软件可…