限量背包问题

问题描述

限量背包问题:从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.hqwc.cn/news/671894.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这是用VS写的一个tcp客户端和服务端的demo

服务端&#xff1a; 客户端&#xff1a; 其实这里面的核心代码就两行。 客户端的核心代码&#xff1a; //套接字连接服务端 m_tcpSocket->connectToHost(_ip,_port);//通过套接字发送数据m_tcpSocket->write(ui.textEditSend->toPlainText().toUtf8());//如果收到信…

【LLM第四篇】名词解释:SFT

看到京东的一段开场白&#xff0c;觉得很有道理&#xff1a; 2023年&#xff0c;大语言模型以前所未有的速度和能力改变我们对智能系统的认知&#xff0c;成为技术圈最被热议的话题。但“百模大战”终将走向“落地为王”&#xff0c;如何将大语言模型的强大能力融入实际业务、…

国内首发 | CSA大中华区启动《AI安全产业图谱(2024)》调研

在人工智能&#xff08;AI&#xff09;技术的快速发展浪潮中&#xff0c;AI安全已成为全球关注的焦点。为应对AI安全带来的挑战&#xff0c;确保AI技术的健康发展&#xff0c;全球范围内的研究机构、企业和技术社区都在积极探索解决方案。 在这一背景下&#xff0c;CSA大中华区…

软考中级-软件设计师(九)数据库技术基础 考点最精简

一、基本概念 1.1数据库与数据库系统 数据&#xff1a;是数据库中存储的基本对象&#xff0c;是描述事物的符号记录 数据库&#xff08;DataBase&#xff0c;DB&#xff09;&#xff1a;是长期存储在计算机内、有组织、可共享的大量数据集合 数据库系统&#xff08;DataBas…

14【PS作图】像素画尺寸大小

【背景介绍】本节介绍像素图多大合适 下图是160*144像素大小,有一个显示文本的显示器,还有一个有十几个键的键盘 像素画布尺寸 电脑16像素,但还有一个显示屏 下图为240*160 在场景素材,和对话素材中,用的是不同尺寸的头像,对话素材中的头像会更清楚,尺寸会更大 远处…

docker的commit命令使用制作镜像

docker run -it ubuntu 最基础的ubuntu启动后安装vim 的命令 apt-get update apt-get -y install vim docker commit -m"my_test_ubuntu" -a"za" 80977284a998 atljw/myubuntu:1.0 将本地镜像推送到阿里云 首先登录阿里云服务-控制台 记得一定要设定设…

APScheduler定时器使用【重写SQLAlchemyJobStore版】:django中使用apscheduler,使用mysql做存储后端

一、环境配置 python3.8.10 包&#xff1a; APScheduler3.10.4 Django3.2.7 djangorestframework3.15.1 SQLAlchemy2.0.29 PyMySQL1.1.0 项目目录情况 gs_scheduler 应用 commands &#xff1a; 主要用来自定义命令&#xff0c;python manage.py crontab schedulers&#…

(网络初识)

网络发展史 独立模式 在最开始计算机被发明出来&#xff0c;但网络还未普及的情况下&#xff0c;每个计算机之间都是相互独立的&#xff1a; 假设现在有一份数据需要处理&#xff0c;然后这份数据的处理又分给三个人分别处理。假设小松处理进行第一部分的处理&#xff0c;当小…

Chromium编译指南2024 Windows11篇-配置depot_tools工具(二)

前言 在《Chromium编译指南2024&#xff08;一&#xff09;》我们探讨了Chromium编译前的准备工作和Visual Studio安装。 接下来&#xff0c;我们将详细介绍如何下载、解压并配置depot_tools工具&#xff0c;以便顺利进行后续的开发工作。 1. 下载解压depot_tools 包 下载d…

【docker 】 push 镜像提示:denied: requested access to the resource is denied

往 Docker Registry &#xff08;私服&#xff09;push 镜像提示&#xff1a;denied: requested access to the resource is denied 镜像push 语法&#xff1a;docker push <registry-host>:<registry-port>/<repository>:<tag> docker push 192.16…

MWeb Pro for Mac:功能强大的Markdown博客编辑器

MWeb Pro for Mac是一款功能强大的Markdown博客编辑器&#xff0c;专为Mac用户设计&#xff0c;提供了一站式的博客写作和发布体验。这款软件不仅支持Markdown语法&#xff0c;还提供了丰富的编辑和排版功能&#xff0c;让用户能够轻松创建出精美的博客内容。 MWeb Pro的即时预…

本地的git仓库和远程仓库

文章目录 1. 远程创建仓库2. 关联远程和本地代码3. 推送本地分支到远程 1. 远程创建仓库 2. 关联远程和本地代码 上面创建完后会得到一个git仓库的链接&#xff0c;有SSH或者http的 http://gitlab.xxxxx.local:18080/xxxxx/dvr_avm.git ssh://gitgitlab.xxxxx.local:10022/xx…