限量背包问题

server/2024/10/22 9:26:41/

问题描述

限量背包问题:从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行第j列表示选i个物品的满载背包(容量j)的选法的排列数。

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

限量背包的实际应用

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


http://www.ppmy.cn/server/39248.html

相关文章

【操作系统】处理机调度

处理机调度 处理机调度概念调度概念调度时机 调度原则调度算法实时调度优先级翻转 处理机调度概念 调度概念 进程切换&#xff1a; CPU资源的当前占用者切换 保存当前进程在PCB中的执行上下文(CPU状态)恢复下一个进程的执行上下文 处理机调度: 从就绪队列中挑选下一个占用…

Mysql中表的创建以及数据类型

DDL 在表结构的操作 表的创建 creat table 表名&#xff08; 字段1 字段类型 [约束] &#xff0c; 字段2 字段类型 [约束] &#xff09;[comment 标注释]; create table tb_user(id int comment ID,一行字段的唯一标识,username varchar(20) comment 用户名,name varchar(…

“现行价格”、“不变价格”与“可比价格”

人们在日常生活中几乎天天要接触到价格问题&#xff0c;去菜场买菜就涉及到农副产品市场价格&#xff0c;去商店买东西就涉及到商品零售价格。在社会经济工作中&#xff0c;国内生产总值、工业总产值等指标都是用货币额表示的&#xff0c;因而在计算时&#xff0c;有采用什么价…

视频超分辨率重构——BasicVSR++

1.概述 BasicVSR++: Improving Video Super-Resolution With Enhanced Propagation and Alignment CVPR 2022 Open Access Repositoryhttps://openaccess.thecvf.com/content/CVPR2022/html/Chan_BasicVSR_Improving_Video_Super-Resolution_With_Enhanced_Propagation_and_A…

淘宝扭蛋机小程序:扭动未来,乐享购物新纪元

一、引言 在数字化浪潮中&#xff0c;淘宝始终走在创新的前沿&#xff0c;不断探索与尝试新的购物方式。今天&#xff0c;我们骄傲地推出淘宝扭蛋机小程序&#xff0c;以全新的视角和体验&#xff0c;让您在购物的同时感受到无尽的乐趣与惊喜。 二、探索未知的购物乐趣 淘宝…

pip在虚拟环境切换存在问题

成功解决anaconda创建虚拟环境后&#xff0c;pip总是定位到全局Python的pip路径中_虚拟环境激活后默认用的pip路径是全局的路径-CSDN博客

数据链路层之 以太网协议

以太网协议 这个协议即规定了数据链路层&#xff0c;同时也规定了物理层的内容。平时使用到的网线&#xff0c;其实也叫做“以太网线”&#xff08;遵守以太网协议的网线&#xff09;。 以太网帧格式 以太网数据帧 帧头 载荷 帧尾。 帧头&#xff1a;目的地址、源地址、类型…

2024年人工智能威胁态势报告:有关AI系统及AI应用的安全风险与安全防护全景

HiddenLayer公司最新发布的《2024年AI威胁场景报告》中&#xff0c;研究人员阐明了AI相关漏洞及其对组织的影响&#xff0c;并为应对这些挑战的IT安全和数据科学领导者提供了指导建议。最后&#xff0c;报告还揭示了各种形式的AI安全控制的前沿进展。 关键数据 平均而言&#x…