背包模型

背包问题基础模型深度总结-文长慎入(01背包,完全背包,多重背包) 先等一下,字多预警,密集恐惧症慎入,喂,你,就是你,小板凳搬好了吗,站久了可是会腿酸的 无节操地王婆卖瓜一下,本文 深度好文 目录 先扯两句 0-1背包 其它类似的状态定义 1 2 小结 3 记忆化搜索 滚动数组(优化空间复杂度) 初始化 完全背包 递推关系 优化时间 滚动数组 简单有效的常数优化 多重背包 状态转移 转化为01背包问题 二进制优化 可... 阅读详情

1.0 1.0 1.0 01 01 01背包问题

每一个物品只能取 1 1 1 次 , C + + ,C++ ,C++ 模板 : : :

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,Arr[110];
int Dp[100010];
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&Arr[i]);
	Dp[0]=1;
	for(int i=1;i<=n;i++)
		for(int j=m;j>=Arr[i];j--)
			Dp[j]+=Dp[j-Arr[i]];
	printf("%d\n",Dp[m]);//m价值的排列个数
	return 0;
}

2.0 2.0 2.0 完全背包问题

每一个物品能取多次 , C + + ,C++ ,C++ 模板 : : :

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,Arr[110];
int Dp[100010];
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&Arr[i]);
	Dp[0]=1;
	for(int i=1;i<=n;i++)
		for(int j=Arr[i];j<=m;j++)
			Dp[j]+=Dp[j-Arr[i]];
	printf("%d\n",Dp[m]);//m价值的排列个数
	return 0;
}

3.0 3.0 3.0 多重背包问题

有 n n n 种物品 , , , 每个物体有 C n t i Cnt_i Cnti​ 个 , , , 每一个的价值是 A r r i , Arr_i, Arri​, 每一个的体积是 V o l i , Vol_i, Voli​, 问容量为 v v v 的背包能装下的价值总和最大的是多少 . . .

3.0.1 3.0.1 3.0.1 直接拆分法

把每个物品拆分成 C n t i Cnt_i Cnti​ 个物品 , , , 然后再跑一遍带价值的一遍背包 . . .

3.0.2 3.0.2 3.0.2 二进制拆分法

把每个物品分成多个不同的物品 , , , 每个物品的价值 , , , 体积分别为原来的 2 0 , 2 1 , 2 2 ⋯ 2 p 2^0,2^1,2^2\cdots 2^p 20,21,22⋯2p 倍 ( 2 0 + 2 1 + 2 2 ⋯ + 2 p < C n t i ) , (2^0+2^1+2^2\cdots+2^p<Cnt_i), (20+21+22⋯+2p<Cnti​), 余下来的物品在组成一个新物品 , , , 再跑一次带价值的一遍背包即可 . . .

3.0.3 3.0.3 3.0.3 单调队列优化

请见于单调队列优化处.

3.0.4 3.0.4 3.0.4 Acwing281

此题为多重背包问题的特殊情况 , , , 询问可行性 . . .

我们考虑贪心 , , , 动态规划最小消耗 . . .

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,Arr[101],Cnt[101],Dp[2][100011];
int main()
{
	while(~scanf("%d%d",&n,&m)&&(n||m))
	{
		for(int i=1;i<=n;i++)
			scanf("%d",&Arr[i]);
		for(int i=1;i<=n;i++)
			scanf("%d",&Cnt[i]);
		memset(Dp,-1,sizeof(Dp));
		Dp[0&1][0]=0;
		for(int i=1;i<=n;i++)
			for(int j=0;j<=m;j++)
				if(Dp[(i-1)&1][j]>=0)
					Dp[i&1][j]=Cnt[i];
				else if(j-Arr[i]>=0&&Dp[i&1][j-Arr[i]]>=1)
					Dp[i&1][j]=Dp[i&1][j-Arr[i]]-1;
		int ans=0;
		for(int j=1;j<=m;j++)
			if(Dp[n&1][j]>=0)ans++;
		printf("%d\n",ans);
	}
	return 0;
}
/*
若f[j]能被拼出

1.前i-1种硬币就能拼成面值j,即在第i阶段开始前,f[j]已经成为true。

2.使用了第i种硬币,即在第i阶段的递推过程中,发现f[j-a[i]]为true,从而使用一个i硬币,使f[j]变为true。

于是可以考虑一种贪心策略:设used[j]表示在第i阶段下将f[j]变为true至少需要使用多少枚第i种硬币。

为了满足我们的贪心策略,我们应该尽量多的使用第1种情况,也就是说在f[j-a[i]]为true时,若f[j]已经为true,就不进行DP转移,并令used[j]=0(我们并没有使用第i种硬币)仅当f[j-a[i]]为true而f[j]为false且已经使用的i硬币used[j-a[i]]<c[i]时,我们使用一个i硬币使f[j]变为true,used[j]=used[j-a[i]]+1;

作者:AsadaShino
链接:https://www.acwing.com/solution/content/11075/
*/

4.0 4.0 4.0 分组背包问题

有 n n n组物品 , , , 每一组至多选择一个物品 ( ( (也可以不选 ) , ), ), 每个物品的体积为 V o l i Vol_i Voli​和价值 A r r i , Arr_i, Arri​,问容量为 v v v的背包能装下的物品价值总和最大值 . . .

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,v,Dp[1100];
int Cnt[1100],Arr[1100][1100],Vol[1100][1100];
int main()
{
	memset(Dp,0xcf,sizeof(Dp));Dp[0]=0;
	scanf("%d%d",&n,&v);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&Cnt[i]);
		for(int j=1;j<=Cnt[i];j++)
			scanf("%d",&Vol[i][j]);
		for(int j=1;j<=Cnt[i];j++)
			scanf("%d",&Arr[i][j]);
	}
	for(int i=1;i<=n;i++)//阶段 
		for(int j=v;j>=0;j--)//状态 
			for(int k=1;k<=Cnt[i];k++)//决策 
				if(j>=Vol[i][k])
					Dp[j]=max(Dp[j],Dp[j-Vol[i][k]]+Arr[i][k]);
	printf("%d\n",Dp[v]);
	return 0;
}
动态规划之二维费用的背包模型 阅读详情

相关推荐

动态规划之多重背包模型

动态规划之多重背包模型

weixin_56265979的博客 1637

常用背包模型

背包

m0_72747430的博客 515

DRAM刷新refresh相关知识归类-基础小知识(三)

RAM每一位数据都是通过芯片内的一个小电容充电(或低电平)存储的。但随着时间的推移,电容逐渐失去电荷。为避免丢失存储的数据,必须定期刷新以将电荷(如果存在)恢复到其原始级别。此刷新过程包括读取每个位的值,然后将其写回。在此“刷新”期间,内存被占用,无法执行加载或存储位等正常操作。知道了应该这么做,但怎么去做以及有什么办法更有效率去做,就是接下来要整理的内容。

Paul 安的博客 1万+

背包问题模型整理

背包问题可以视为组合dp,而最长上升子序列问题视为线性dp(区间dp),它们的区别在于当前位置的决策跟前面具体某个的值有没有关系,或者说,当前位置的选与不选与已经确定的序列的最后一个位置有没有关系,如果有关系,那么就是线性dp,需要以i作为结尾,如果没关系就是组合dp,前i个笼统考虑即可。

m0_74120503的博客 2696

SillyTavern角色卡制作全攻略:如何用AI还原你喜欢的虚构角色(附三叶完整角色卡JSON)

本文详细介绍了如何使用SillyTavern制作高质量AI角色卡,以《你的名字》中的宫水三叶为例,从角色特征提取、对话风格捕捉到JSON结构优化,全面解析AI角色扮演的创作技巧。通过具体的写作示例和完整角色卡JSON,帮助二次元爱好者和同人创作者实现虚构角色的精准还原与生动互动。

pandas7gardener的博客 2132

MicroPython驱动ST7789屏避坑实录:从GB2312到完整中文字库的升级之路

本文详细介绍了使用MicroPython驱动ST7789显示屏实现完整中文字库显示的实战方案。从硬件选型到字库系统改造,再到内存优化和显示性能提升,提供了一套突破GB2312限制的全套中文显示解决方案,特别适合ESP32开发者在物联网设备中实现高质量中文显示。

weixin_29190573的博客 394

树形背包思考模型

树形背包常用思考模型 模型一 首先对于每个节点我们在dfs中dp转移时可以想象成一个分组背包,每次新遍历一个子树就可以想象成一个分组背包的下一组,转移时利用之前的背包状态进行转移,如果觉得这个模型比较难理解可以看下面的模型二 模型二 首先对于每次新遍历一个结点我们都可以想象成是在给这个结点拼接一颗子树如下图 解释:圆点为树的结点,三角形为一颗子树,线段为边,箭头是拼接方向。蓝色为之前计算好的状态的树,红色为即将拼接上去的一颗子树(这颗子树在dfs时计算好了所有状态) 模型一与模型二的联系 回到模型

hao_6_6的博客 531

联想X3650M5服务器双模式切换实战:UEFI与Legacy BIOS如何选择?

本文深入探讨了联想X3650 M5服务器在UEFI与Legacy BIOS启动模式间的选择策略。文章从技术原理、决策矩阵、实战切换步骤及后期验证等方面,为企业IT管理员提供了基于操作系统兼容性、存储架构、安全合规与运维习惯的完整决策框架,帮助其在数据中心硬件生命周期管理中做出明智选择。

weixin_29207533的博客 281

动态规划---常用的背包模型(从原理到优化详细讲解)

动态规划---常用的背包模型(从原理到优化详细讲解)

qq_68734252的博客 2049

在unity urp项目中 通过图片创建材质(透明光晕)

unity中通过图片创造材质(urp管道)

m0_49721415的博客 1541

一条时间轴上的商品供给:商品供给域事件全景、八大子域事件清单与事件契约规范的工程推演

本文以虚构连锁零售企业“青禾鲜市”为例,用事件风暴重新梳理商品供给域:先剖析同词异义、状态模糊、隐式依赖与被动兜底四类冲突,再以时间轴、八条子域泳道与关键事件铺出全景地图,确立一个事件只有一个户口;随后为总店商品、门店商品、价格、库存、质量、标签、变更通知与操作日志列出聚合、事件、命令与策略,并统一命名、信封结构、版本与幂等规范。程序体检把初稿14个问题清零,仿真显示按聚合版本号更新可售视图可将误判从两位数百分比降到0.019%。文末给出四轮工作坊节奏与新品引入、全国调价、批次召回走查剧本。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 5万+

【算法】01背包模型

目录题目01背包相关要素1. 背包2. 对于物品i思路1. dp数组模型2. 递推公式(难点):3. dp数组初始化值:dp[i][0] dp[0][j]1. dp[i][0] = 02. dp[0][j]4. 确定遍历顺序:2个维度:物品和背包容量逻辑图代码实现 题目 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i], 得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 01背包相关要素 背包容量w、物品体积weight[i]、物体

weixin_45325628的博客 909

9.6华为OD机试真题 新系统 - 仓储货物有序出库 (Java/Py/C/C++/Js/Go)

9.6华为OD机试真题 新系统 - 仓储货物有序出库 (Java/Py/C/C++/Js/Go)

算法大师! 1201

【背包九讲】背包模型的板子

纯记忆

qq_35684989的博客 315

2.Vivado软件基础操作

在本章节,我们以一个简单的计数器实例,介绍FPGA开发软件Vivado的基础操作流程,计数器实例程序的设计,在本课程中先不同掌握,后续课程将针对verilog编程进行讲解。 打开Vivado软件,会看到如下的界面: 点击如下图所示的: 点击Next> 将这个地方,设置路径,注意路径必须是英文路径。且文件夹名称第一个字符不能为数字。所有路径的名称的字符数量不能超过144个符号。 点击Next> 点击Next> 点...

FPGA/MATLAB学习教程/源码/项目合作开发 4479

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

动态规划DP 背包模型 概览

本文主要提供寻找各类背包问题的链接,便于检索。

fcc13461862452的博客 308

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

动态规划二:背包模型

动态规划设计方法求解原理常见递推关系式线性DP超级楼梯数字三角形最长公共子序列最长上升子序列最大子段和区间DP回文括号匹配猴子派对乘法难题树形DP别墅派对战略游戏工人请愿书完美的服务背包类树形DP苹果树二次扫描于换根最远距离数位DP不吉利的数字定时炸弹Round Numbers计数问题数字权值状态压缩DP旅行商问题旅行商变形1旅行商变形2玉米田炮兵阵地马车旅行插头DP铺砖方格取数多回路连通性问题单回路连连通性问题单通路连连通性问题其他DP有向图最短路径最长递增子序列信封嵌套最长回文子序列扔玻璃球戳气球编辑.

Debroon 1060

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

背包DP模型

01背包DP

jyyyyx的算法之旅 110

深入学习C++:背包动规的基础模型

本文介绍了动态规划中的经典背包问题及其解法。主要包含五种类型:1)0-1背包(物品只能选一次),使用二维状态转移和一维空间优化;2)完全背包(物品无限选),需正序遍历;3)多重背包(物品有限数量),采用二进制拆分优化;4)分组背包(每组选一个物品);5)变种问题如二维费用背包。每种类型都给出了状态定义、转移方程及实现代码,并指出解题关键点在于正确理解问题类型、定义状态和优化空间。

善良的小乔的博客 931

背包模型——AcWing 423. 采药

背包模型是一种常见的算法问题模型,它主要涉及将一些物品放入一个容量有限的背包中,以达到某种最优目标,如最大化价值或最小化重量等。

u014114223的博客 2508

完全背包模型

完全背包的模型如下: 给定N个物品,其中第i个物品的体积Vi,价值为Wi,并且有无数个。有一容积为M的背包,要求选择一些物品放入背包,使得物品总体积不超过M的前提下,物品的价值总和最大。 输入样例: 10 4 2 1 3 3 4 5 7 9 输出样例 12 使用传统的二维线性DP做法: F[i,j]表示从前i中物品中选出了总体积为j的物品放入背包,物品的最大价值和。 只要拿一个物品,一种情况是不...

hwdn3000的博客 306

背包模型(入门)

本文介绍了三种背包问题的动态规划解法:01背包、完全背包和多重背包。01背包通过二维状态转移方程求解,可优化为一维数组;完全背包在01背包基础上允许无限取用物品,状态转移方程略有不同;多重背包则将物品数量视为限制条件,可通过二进制优化降低复杂度。每种方法都给出了对应的代码实现,适用于不同范围的输入数据。

weixin_44319729的博客 1344

背包模型题目集合

文章目录背包模型01背包AcWing 423. 采药AcWing 1024. 装箱问题Luogu 2925 干草出售Proud Merchants完全背包P1616 疯狂的采药P1853 投资的最大效益Piggy-Bank多重背包Luogu P1776 宝物筛选HDU 1059 Dividing混合背包P1833 樱花分组背包AreYouBusy 背包模型 01背包 AcWing 423. 采药 思路: 裸的01背包问题,在本题中我们将采药时间当作背包容量限制, dp[i][j]表示前i个草药用了j个时间的

qq_35975367的博客 521

背包问题模型总结

背包模型总结汇总。

涛涛的个人博客 4660

算法学习系列(五十五):背包模型(三)

今天介绍的是背包模型,还是以题目的形式来介绍的。主要讲了背包问题求方案,就是由最优方案递推回去即可。还有就是一些比较经典的背包问题,其实明显能感觉到其实背包问题拿暴搜来做也是可以的,因为有些问题就是在中间夹杂着暴力枚举所有方案的思想,再加上数据范围小的,就可以拿暴搜来做。还有图论问题,求方案就是求一个拓扑序的一个过程,只不过要根据一些值来确定其是否存在入度,然后找方案,然后感觉这些东西一下子活起来了,题做得多了就会有这种感觉,继续加油吧!

weixin_60033897的博客 1280
上一篇: 二分图匹配的可行边和必须边
下一篇: 动态规划的优化
DarksideCoder
博客等级 码龄7年 34粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值