限量背包问题

问题描述

限量背包问题:从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组真题

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

我独自升级:崛起怎么下载 我独自升级游戏下载教程分享

定于5月8日全球揭幕的《我独自升级崛起》——一款扣人心弦的动作RPG巨制&#xff0c;灵感采撷于同名动画及网络漫画的热潮&#xff0c;誓将引领满怀热忱的玩家步入一场交织着深邃探索和宏大规模的奇妙冒险。该游戏立足于一个独树一帜的网络武侠宇宙&#xff0c;细腻刻画了一个凡…

VSCode通过SSH连接虚拟机Ubuntu失败

问题说明 最近使用VSCode通过SSH连接Ubuntu&#xff0c;通过VSCode访问Ubuntu进行项目开发&#xff0c;发现连接失败 在VSCode中进行SSH配置 这些都没有问题&#xff0c;但在进行连接时候出现了问题&#xff0c;如下&#xff1a; 出现了下面这个弹窗 解决方法 发现当…

软件测试职责

软件测试职责主要包括以下几个方面&#xff1a; 1. 需求分析&#xff1a;理解软件需求规格说明书&#xff0c;确保测试活动覆盖所有的功能需求和非功能需求&#xff08;如性能、安全性、兼容性等&#xff09;。 2. 测试计划制定&#xff1a;根据项目需求&#xff0c;设计测试…

NodeJS 如何在npm运行时设置Windows控制台的标题?

通过代码设置 const server app.listen(port, () > {console.log(主机名称&#xff1a;, global.hostname)console.log(主机IP地址&#xff1a;, global.host)console.log(后台服务端口号&#xff1a;, port)console.log(恭喜你&#xff0c;启动成功!)process.title node …

图像处理

图像处理 导入图片 导入io模块&#xff0c;读取文件所在位置&#xff0c;将生成的图像数据赋给变量img&#xff0c;显示图像 from skimage import ioimgio.imread(D:\工坊\图像处理\十个勤天2.png)io.imshow(img) 运行结果&#xff1a; 将图片进行灰度处理 from skimage i…

Autodesk AutoCAD 2025 for Mac:强大的二维三维绘图工具

Autodesk AutoCAD 2025 for Mac是一款专为Mac用户打造的计算机辅助设计软件&#xff0c;它在继承了AutoCAD系列软件的优秀传统的基础上&#xff0c;针对Mac系统进行了全面优化&#xff0c;为用户提供了更出色的绘图和设计体验。 这款软件不仅支持用户创建和编辑复杂的二维几何图…

Nvidia发布Llama3-ChatQA-1.5: 提升对话问答和表格推理能力,平均性能超越GPT-4

前言 近日&#xff0c;Nvidia推出了一款名为Llama3-ChatQA-1.5的对话问答模型。该模型在对话式问答和检索增强型生成等能力方面表现出色&#xff0c;在综合评测指标上甚至超越了当前业界顶尖的GPT-4模型。 技术特点 Llama3-ChatQA-1.5是基于Llama-3基础模型训练而成的。相比之…

01-基本概念

1. 到底什么是数据结构&#xff1f; 数据结构是指在计算机中组织和存储数据的方式&#xff0c;它涉及到数据元素之间的关系以及对这些关系进行操作的方法。数据结构可以看作是一种将数据组织起来以便有效使用的方式&#xff0c;它关注数据的组织、存储和操作&#xff0c;以及如…

关于冯诺依曼体系结构 和 操作系统(Operator System)的概念讲解(冯诺依曼体系结构,操作系统的作用等)

目录 一、冯诺依曼体系结构 二、操作系统 1. 概念 2. 设计操作系统的目的 3.系统调用和库函数概念 4.总结 三、完结撒❀ 一、冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截…

标贝数据采集标注在自动驾驶场景中落地应用实例

AI数据服务作为人工智能和机器学习的基础&#xff0c;在自动驾驶领域中有着重要地位。与其他人工智能应用场景相比&#xff0c;自动驾驶的落地场景相对复杂&#xff0c;想要让汽车本身的算法做到处理更多、更复杂的场景&#xff0c;就需要运用大量场景化高质量AI数据做支撑。标…

第八节课《大模型微调数据构造》

大模型微调数据构造&#xff08;补充课程&#xff09;_哔哩哔哩_bilibili Tutorial/FineTune at main Focusshang/Tutorial GitHub 一、大模型训练数据介绍 预训练&#xff1a; 网络、论文数据&#xff0c;无标签数据transform算法base model典型&#xff1a;GPT监督微调 对…

【C语言】整数,浮点数数据在内存中的存储

Tiny Spark get dazzling some day. 目录 1. 整数在内存中的存储1.1 原码、反码、补码1.1 大小端存储1.2.1 字节序分类1.2.2 判断字节序 2. 浮点数在内存中的存储2.1 浮点数的存储形式2.2 浮点数的 “ 存 ”2.2.1 S2.2.2 E2.2.3 F 2.3 浮点数的 “ 取 ”2.3.1 S2.3.2 E、F 3. 浮…

ISIS的基本概念

1.ISIS概述 IS-IS是一种链路状态路由协议&#xff0c;IS-IS与OSPF在许多方面非常相似&#xff0c; 例如运行IS-IS协议的直连设备之间通过发送Hello报文发现彼此&#xff0c;然后建立邻接关系&#xff0c;并交互链路状态信息。 CLNS由以下三个部分组成&#xff1a; CLNP&#xf…

新的项目springboot

buybuyshenglombok <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency> 添加依赖 lombok package com.example.demo.pojo;import lombok.AllArgsConstructor; import lombok.Data; import …

LLM应用:prompt提示让大模型总结生成Mermaid流程图;充当角色输出

1、prompt提示让大模型总结生成Mermaid流程图 生成内容、总结文章让大模型Mermaid流程图展示&#xff1a; mermaid 美人鱼, 是一个类似 markdown&#xff0c;用文本语法来描述文档图形(流程图、 时序图、甘特图)的工具&#xff0c;您可以在文档中嵌入一段 mermaid 文本来生成 …

项目实战 | 如何恰当的处理 Vue 路由权限

前言 哈喽&#xff0c;小伙伴你好&#xff0c;我是 嘟老板。最近接了一个成本千万级的前端项目运维工作&#xff0c;本着 知己知彼 的态度&#xff0c;我将整个前端的大致设计思路过了一遍。不看不知道&#xff0c;一看…吓一跳。光是 路由权限 这块儿的设计&#xff0c;都让我…

linux上Redis安装使用

环境centOS8 redis是缓存数据库&#xff0c;主要是用于在内存中存储数据&#xff0c;内存的读写很快&#xff0c;加快系统读写数据库的速度 一、Linux 安装 Redis 1. 下载Redis 官网下载Downloads - Redis 历史版本Index of /releases/ 本文中安装的版本为&#xff1a;h…

Celery + redis 异步分布式任务队列安装测试

Celery 异步分布式任务队列 Celery 5.4.0 官方文档 环境&#xff1a;3台 centos7.9 普通用户 redisSchedulerworkerdp951dp96111dp971 文章目录 Celery 异步分布式任务队列1、Celery 介绍2、安装部署2.1 安装消息中间件&#xff08;broker&#xff09;2.2 安装Celery 3、功能…

mac 本地使用docker 运行es,kibana

1.下载 m芯片一些版本不支持.踩过坑.翻看官网才知道只有部分镜像支持m芯片 https://hub.docker.com/添加链接描述 docker pull elasticsearch:7.17.21 docker pull kibana:7.17.21镜像已经下载下来了 2.创建文件映射-挂载 /Users/lin/dev/dockerMsg 其中lin是自己的用户名…

【数据结构/C语言】单链表的实现

目录 一、单链表的基本概念 单链表的简介 单链表的特点 二、预备知识 三、单链表的基本结构 四、单链表的基本操作 1.链表打印 2.申请节点 3.头插 4.尾插 5.头删 6.尾删 7.查找节点 8.指定位置之前插入 9.指定位置之后插入 10.删除给定节点 11.删除给定节点之…