【算法笔记】三种背包问题——背包 DP

手把手教你用51单片机和L9110S电机驱动模块打造智能循迹小车 本文详细介绍了如何使用51单片机和L9110S电机驱动模块构建智能循迹小车,涵盖硬件选型、电路连接、PWM调速及PID控制算法优化。通过实战案例,帮助开发者快速掌握智能小车的关键技术,提升嵌入式开发能力。 阅读详情
AI摘要

本文深入探讨了动态规划在解决背包问题中的应用,包括01背包、完全背包和多重背包的原理及优化方法。通过状态转移方程和实例代码,解析了如何在不同场景下求解背包问题,以实现物品价值最大化。此外,还讨论了如何处理大规模数据以避免内存错误,并提出了空间复杂度的优化策略。

前言

背包(Knapsack)问题是经典的动态规划问题,也很有实际价值。

01背包

洛谷 P2871 [USACO07DEC] Charm Bracelet S
AtCoder Educational DP Contest D - Knapsack 1
有 n n n个物品和一个总容量为 W W W的背包。第 i i i件物品的重量是 w i w_i wi​,价值是 v i v_i vi​。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。

knapsack

这是最原始的01背包问题(即每个物品只能选 0 0 0或 1 1 1次)。下面我们来看如何求解。
令 f i , j f_{i,j} fi,j​表示只考虑前 i i i个物品的情况下,容量为 j j j的背包所能装的最大总价值。则最终答案为 f n , W f_{n,W} fn,W​,状态转移方程为:
f i , j = { 0 ( i = 0 / j = 0 ) max ⁡ ( f i − 1 , j , f i − 1 , j − w i + v i ) ( i > 0 , j ≥ w i ) f_{i,j}=\begin{cases} 0 & (i=0/j=0) \\ \max(f_{i-1,j},f_{i-1,j-w_i}+v_i) & (i>0,j\ge w_i) \end{cases} fi,j​={0max(fi−1,j​,fi−1,j−wi​​+vi​)​(i=0/j=0)(i>0,j≥wi​)​
依次递增 i i i,逐步增加问题规模即可求解。时间、空间复杂度均为 O ( n W ) \mathcal O(nW) O(nW)。
在本题中, O ( n W ) \mathcal O(nW) O(nW)的空间复杂度容易MLE,因此考虑使用数组重复利用或者滚动表的优化。

压缩掉 f f f的第一维,变成:
f j = max ⁡ ( f j , f j − w i + v i ) f_j=\max(f_j,f_{j-w_i}+v_i) fj​=max(fj​,fj−wi​​+vi​)
此时空间复杂度为 O ( W ) \mathcal O(W) O(W)。
一定要牢记这个公式,注意使用时需倒序枚举 j j j,防止串连转移。参考代码:

#include <cstdio>
#define setmax(x, y) if(x < y) x = y
using namespace std;

int f[12881];

int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	while(n--)
	{
		int w, v;
		scanf("%d%d", &w, &v);
		for(int i=m; i>=w; i--)
			setmax(f[i], f[i - w] + v);
	}
	printf("%d\n", f[m]);
	return 0;
}

01背包还有一种简单变形,即求最小剩余空间,此时用 ( ( (总空间 − - −最大可装空间 ) ) )即可。

#include <cstdio>
#define setmax(x, y) if(x < y) x = y
using namespace std;

int f[20005];

int main()
{
	int n, v;
	scanf("%d%d", &v, &n);
	while(n--)
	{
		int w;
		scanf("%d", &w);
		for(int i=v; i>=w; i--)
			setmax(f[i], f[i - w] + w);
	}
	printf("%d\n", v - f[v]);
	return 0;
}

扩展:对付更大的 W W W

AtCoder Educational DP Contest E - Knapsack 2
本题和普通的01背包完全相同,只是数据范围改为 n ≤ 100 , W ≤ 1 0 9 , v i ≤ 1 0 3 n\le 100,W\le 10^9,v_i\le 10^3 n≤100,W≤109,vi​≤103。

注意数据范围, W ≤ 1 0 9 W\le 10^9 W≤109意味着只要开这么大的数组都会MLE,因此我们考虑修改dp状态。前看原来的dp状态,本质上就是“确定重量,求最大价值”,现在我们反过来,即“确定价值,求最小重量”。令 f i , j f_{i,j} fi,j​表示只用前 i i i个物品,达到总价值为 j j j所需的最小空间。由于 n ≤ 100 , v i ≤ 1 0 3 n\le 100,v_i\le 10^3 n≤100,vi​≤103,所以 ∑ v i ≤ 1 0 5 \sum v_i\le 10^5 ∑vi​≤105,极限情况下dp数组只需要开 n × ∑ v i ≈ 1 0 7 n\times\sum v_i\approx10^7 n×∑vi​≈107即可,相对而言会好很多。下面考虑dp状态转移方程:
f i , j = { + ∞ ( i = 0 , j ≠ 0 ) 0 ( i ≥ 0 , j = 0 ) min ⁡ ( f i − 1 , j , f i − 1 , j − v i + w i ) ( i > 0 , j > 0 ) f_{i,j}=\begin{cases} +\infin & (i=0,j\ne0) \\ 0 & (i\ge 0,j=0) \\ \min(f_{i-1,j},f_{i-1,j-v_i}+w_i) & (i>0,j>0) \end{cases} fi,j​=⎩ ⎨ ⎧​+∞0min(fi−1,j​,fi−1,j−vi​​+wi​)​(i=0,j=0)(i≥0,j=0)(i>0,j>0)​
其中, i = 0 , j ≠ 0 i=0,j\ne 0 i=0,j=0这种情况不存在,所以初始值为 + ∞ +\infin +∞。最终答案,即为最大的 j j j,使得 f n , j ≤ W f_{n,j}\le W fn,j​≤W,更新状态时可同时记录这个答案。

这种算法的时间和空间都可以优化:

  • 时间:对于每个 i i i,循环迭代 j j j时只需到 v 1 + v 2 + ⋯ + v i v_1+v_2+\dots+v_i v1​+v2​+⋯+vi​即可,因为当前的总价值不可能超过这个值;
  • 空间:用与前面完全相同的方法,压缩掉第一维空间,变成 f j = min ⁡ ( f j , f j − v i + w i ) f_j=\min(f_j,f_{j-v_i}+w_i) fj​=min(fj​,fj−vi​​+wi​)(注意要倒序枚举 j j j)

运用了两种优化的代码如下:

#include <cstdio>
#include <cstring>
using namespace std;

long long f[100005], t, tot, ans;

int main()
{
	int n, sz;
	scanf("%d%d", &n, &sz);
	memset(f, 0x3f, sizeof f);
	f[0] = 0;
	while(n--)
	{
		int w, v;
		scanf("%d%d", &w, &v);
		tot += v;
		for(int i=tot; i>=v; i--)
			if((t = f[i - v] + w) < f[i] && t <= sz)
			{
				f[i] = t;
				if(i > ans) ans = i;
			}
	}
	printf("%lld\n", ans);
	return 0;
}

完全背包

洛谷 P1616 疯狂的采药
有 n n n个物品和一个总容量为 W W W的背包。第 i i i件物品的重量是 w i w_i wi​,价值是 v i v_i vi​。每个物品可以使用无限次。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。

这种背包与01背包唯一的不同之处在于,每个物品使用次数不限,所以参考01背包的dp状态:
令 f i , j f_{i,j} fi,j​表示只考虑前 i i i个物品的情况下,容量为 j j j的背包所能装的最大总价值,则有:
f i , j = max ⁡ k = 0 + ∞ { f i − 1 , j − k × w i } + v i × k = max ⁡ k = 0 ⌊ j w i ⌋ { f i − 1 , j − k × w i } + v i × k \begin{aligned} f_{i,j}=\max_{k=0}^{+\infin}\{f_{i-1,j-k\times w_i}\}+v_i\times k\\ =\max_{k=0}^{\lfloor\frac j{w_i}\rfloor}\{f_{i-1,j-k\times w_i}\}+v_i\times k \end{aligned} fi,j​=k=0max+∞​{fi−1,j−k×wi​​}+vi​×k=k=0max⌊wi​j​⌋​{fi−1,j−k×wi​​}+vi​×k​
可以发现,实际上只需要用 f i , j = max ⁡ ( f i − 1 , j , f i , j − w i + v i ) f_{i,j}=\max(f_{i-1,j},f_{i,j-w_i}+v_i) fi,j​=max(fi−1,j​,fi,j−wi​​+vi​)即可,因为此时的 f i , j − w i f_{i,j-w_i} fi,j−wi​​会被 f i , j − 2 w i f_{i,j-2w_i} fi,j−2wi​​更新, f i , j − 2 w i f_{i,j-2w_i} fi,j−2wi​​又会被 f i , j − 3 w i f_{i,j-3w_i} fi,j−3wi​​更新,以此类推,这样算与前面的公式等效。

对比一下01背包和完全背包的状态转移方程:
f i , j = max ⁡ ( f i − 1 , j , f i − 1 , j − w i + v i ) f i , j = max ⁡ ( f i − 1 , j , f i , j − w i + v i ) \begin{aligned} f_{i,j}=\max(f_{i-1,j},f_{i-1,j-w_i}+v_i) \\ f_{i,j}=\max(f_{i-1,j},f_{i,j-w_i}+v_i) \end{aligned} fi,j​=max(fi−1,j​,fi−1,j−wi​​+vi​)fi,j​=max(fi−1,j​,fi,j−wi​​+vi​)​
实际上,区别就在于一个是 f i − 1 , j − w i f_{i-1,j-w_i} fi−1,j−wi​​,一个是 f i , j − w i f_{i,j-w_i} fi,j−wi​​。所以仍可以使用数组压缩,只需要改变一下循环顺序,是不是很神奇?
long long别忘了~

#include <cstdio>
#define setmax(x, y) if(x < y) x = y
using namespace std;

long long f[10000005];

int main()
{
	int sz, n;
	scanf("%d%d", &sz, &n);
	while(n--)
	{
		int w, v;
		scanf("%d%d", &w, &v);
		for(int i=w; i<=sz; i++)
			setmax(f[i], f[i - w] + v);
	}
	printf("%lld\n", f[sz]);
	return 0;
}

多重背包

洛谷 P1776 宝物筛选
有 n n n个物品和一个总容量为 W W W的背包。第 i i i件物品的重量是 w i w_i wi​,价值是 v i v_i vi​,最多能选择 m i m_i mi​次。我们要选择一些物品,使这些物品的重量总和不超过背包容量,且价值总和最大。 n ≤ 100 , ∑ m i ≤ 1 0 5 , W ≤ 4 × 1 0 4 n\le100,\sum m_i\le10^5,W\le 4\times10^4 n≤100,∑mi​≤105,W≤4×104。

很容易想到,可以转换成每件物品都被拆分成 m i m_i mi​个只能选一次的物品,即 N = ∑ m i N=\sum m_i N=∑mi​的01背包。很明显,这样做的时间复杂度是 O ( W ∑ m i ) \mathcal O(W\sum m_i) O(W∑mi​),会TLE。因此,我们可以优化拆分的方法,将 m m m转化为 x + ∑ j = 0 i 2 j x+\sum\limits_{j=0}^i 2^j x+j=0∑i​2j的形式,举几个栗子:

  • 5 = ( 1 + 2 ) + 2 5=(1+2)+2 5=(1+2)+2,其中 i = 1 , x = 2 i=1,x=2 i=1,x=2;
  • 16 = ( 1 + 2 + 4 + 8 ) + 1 16=(1+2+4+8)+1 16=(1+2+4+8)+1,其中 i = 3 , x = 1 i=3,x=1 i=3,x=1;
  • 31 = ( 1 + 2 + 4 + 8 + 16 ) 31=(1+2+4+8+16) 31=(1+2+4+8+16),其中 i = 4 , x = 0 i=4,x=0 i=4,x=0。

这种方法的正确性这里就不详细说明了,主要依赖于二进制的拼凑。容易发现,数字 m m m按这种拆分的方法会被拆分为 ⌈ log ⁡ 2 m ⌉ \lceil\log_2m\rceil ⌈log2​m⌉个数字的和,因此总时间复杂度为 O ( W ∑ i = 1 n log ⁡ m i ) \mathcal O(W\sum\limits_{i=1}^n\log m_i) O(Wi=1∑n​logmi​),可以通过此题。

还有一种单调队列/单调栈优化,同样针对多重背包问题,时间复杂度为 O ( n W ) \mathcal O(nW) O(nW),有时不一定优于二进制优化,这里就不多说了。下面给出二进制优化的参考程序。

#include <cstdio>
#define maxw 40004
#define setmax(x, y) if(x < y) x = y
using namespace std;

int n, w, f[maxw];

inline void add(int a, int b) // a: value, b: weight
{
	for(int i=w; i>=b; i--)
		setmax(f[i], f[i - b] + a);
}

int main()
{
	scanf("%d%d", &n, &w);
	while(n--)
	{
		int a, b, c;
		scanf("%d%d%d", &a, &b, &c);
		for(int i=0; (1<<i)<=c; i++)
			add(a << i, b << i), c -= 1 << i;
		if(c) add(a * c, b * c);
	}
	printf("%d\n", f[w]);
	return 0;
}

混合背包

没错,就是前三种放在一起的背包。不用的物品有不同的种类。比如洛谷 P1833 樱花,就是混合背包。不过,也不要慌,直接用个分支判断,比如:

for (循环物品种类) {
  if (是 0 - 1 背包)
    套用 0 - 1 背包代码;
  else if (是完全背包)
    套用完全背包代码;
  else if (是多重背包)
    套用多重背包代码;
}

实际上也不一定要这样,可以全部统一成混合背包:

  • 对于01背包,可选数目 k i = 1 k_i=1 ki​=1。
  • 对于完全背包,可选数目 k i = ⌈ W w i ⌉ k_i=\lceil\frac W{w_i}\rceil ki​=⌈wi​W​⌉。

这里就不给出详细代码,有兴趣的读者可以自己尝试一下。

总结

让我们来总结一下三种基本背包DP的异同:

项目01背包完全背包多重背包
适用场景每件物品只能选择一次每件物品可以无限选择每件物品可以选择的次数有限
状态转移方程1 max ⁡ ( f j , f j − w i + v i ) \max(f_j,f_{j-w_i}+v_i) max(fj​,fj−wi​​+vi​) max ⁡ ( f j , f j − w i + v i ) \max(f_j,f_{j-w_i}+v_i) max(fj​,fj−wi​​+vi​)基本同01背包
时间复杂度2 O ( n W ) \mathcal O(nW) O(nW) O ( n W ) \mathcal O(nW) O(nW) O ( W ∑ log ⁡ k i ) \mathcal O(W\sum\log k_i) O(W∑logki​)
空间复杂度3 O ( W ) \mathcal O(W) O(W) O ( W ) \mathcal O(W) O(W) O ( W ) \mathcal O(W) O(W)
编码难度低低中

创作不易,如果觉得好就请给个三连,谢谢支持!


  1. 压缩掉第一维的 f j f_j fj​,01背包为倒序枚举 j j j,完全背包为正序 ↩︎

  2. 完全背包为优化后的复杂度,多重背包为二进制优化的复杂度。 ↩︎

  3. 指压缩第一维后的dp数组大小。 ↩︎

背包算法的简要思路(精髓版) 背包算法【动态规划实现】 背包算法是给出了n个物品的价值与重量,以及最大承重W,求出最大承重内的物品最大总价值。 我们从开头开始分析:0个物品和0承重的总价值都是0,令F[i][j]为总价值,当w(i)> j时,该物体不能放入,f[i][j]就等于f[i-1][j];当w[i] < j时,判断物体是否可以放入,比较F[I-1][j]和F[I-1][j-w(I)]+v[i]的大小,取较大的值。 专门再令一个数组储存所取的物品标号。 代码实现: ... 阅读详情

相关推荐

九大背包问题专题--有依赖的背包问题(树形Dp结合)

9.有依赖的背包问题 问题: 有N件物品和一个容量是V的背包。 物品之间具有依赖关系,且依赖关系组成一棵树的形状。如果选择一个物品,则必须选择它的父节点。 如图所示 如果选择物品5,则必须选择物品1和2,这是因为2是5的父节点,1是2的父节点。 每件物品的编号是i,体积是vi,价值是wi,依赖的父节点编号是pi。物品的下标范围是1…N. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包的容...

gl620321的博客 3282

算法学习之动态规划DP——背包问题

一维状态第i轮对体积为 3的物品进行决策,则f[7]由f[4]更新而来,这里的f[4]正确应该f[i-1][4],但从小到大枚举j这里的f[4]在第i轮计算却变成了f[i][4]。当逆序枚举背包容量j时,我们求f[7]同样由f[4]更新,但由于是逆序,这里的f[4]还没有在第i轮计算,所以此时实际计算的f[4]仍然是f[i - 1][4]。在二维情况下,状态f[i][j]是由上一轮i - 1的状态得来的,f[i][j]与f[i - 1][j]是独立的。这Si个数分别为2^0, 2^1, 2^2……

m0_72955669的博客 5924

C++ DP算法,动态规划——背包问题(背包九讲)

有N件物品和一个容量为V的背包。放入第i件物品耗费的空间是Ci​,得到的价值是Wi​。求解将哪些物品装入背包可使价值总和最大。有N件物品和一个容量为V的背包。放入第i件物品耗费的空间是Ci​,得到的价值是Wi​。求解将哪些物品装入背包可使价值总和最大。有N件物品和一个容量为V的背包。放入第i件物品耗费的空间是Ci​,得到的价值是Wi​。求解将哪些物品装入背包可使价值总和最大。有N件物品和一个容量为V的背包。放入第i件物品耗费的空间是Ci​,得到的价值是Wi​。求解将哪些物品装入背包可使价值总和最大。有N件物

小天狼星_布莱克 的博客 2918

背包九讲(dp问题详解)

【代码】背包九讲(dp问题详解)

weixin_64394633的博客 2191

华中科技大学 计算机组成原理 educoder Logisim平台 计算机数据表示实验

本文主要是对 计算机数据表示实验的笔记和相关Logisim平台的图,供大家学习交流使用。 需要源文件或者源代码,可以留言评论! 目录实验目的第1关:汉字国标码转区位码实验第2关:汉字机内码获取实验第3关:偶校验编码设计第4关:偶校验解码电路设计第5关:16位海明编码电路设计第6关:16位海明解码电路设计第7关:海明编码流水传输实验第8关:16位CRC并行编解码电路设计第9关:CRC编码流水传输实验实验结果: 实验目的 本实训将帮助同学们巩固对计算机中数据表示方法的理解,要求能设计汉字国标码与区位码之间的转换

weixin_48383580的博客 2万+

MaPLe: Multi-modal Prompt Learning

具体而言,我们在语言分支中附加可学习的上下文标记,并通过耦合函数显式地将视觉 Prompt 置于语言 Prompt 上,以建立它们之间的交互。使用 Prompt 来适应CLIP (语言或视觉) 的单个分支中的表示是次优的,因为它不允许在下游任务上动态调整两个表示空间的灵活性。由此,提出了一种分支感知的多模态 Prompt,通过在两种模态之间共享提示来协调 CLIP 的视觉和语言分支。在 Prompt Tuning 中,必须采取多模态方法获得同时适应 CLIP 的视觉和语言分支,以实现上下文优化的完整性。

weixin_48907099的博客 1051

动态规划dp——背包问题

本文介绍了动态规划中的背包问题。

2301_80358171的博客 2571

别再只会用QTcpSocket了!手把手教你用QSslSocket为你的Qt网络应用加上SSL/TLS加密(附完整代码示例)

本文详细介绍了如何将Qt网络应用从QTcpSocket迁移到QSslSocket,实现SSL/TLS加密传输。通过对比API差异、解析核心机制和提供完整代码示例,帮助开发者快速掌握安全网络编程技巧,有效防范数据窃听和中间人攻击等安全风险。

weixin_30654583的博客 400

【dp】背包问题

背包问题是⼀种组合优化的问题。问题可以描述为:给定⼀组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。01背包问题:每个物品只有⼀个完全背包问题:每个物品有无限多个多重背包问题:每件物品最多有 x 个混合背包问题:每个物品会有上面三种情况分组背包问题:物品有 n 组,每组物品里有若干个,每组里最多选⼀个物品不一定装满背包背包一定装满限定条件只有⼀个:比如体积 -> 普通的背包问题限定条件有两个:比如体积 + 重量 -> 二维费用背包问题。

YoungMLet的博客 2203

【WebLogic】Linux图形化界面安装WebLogic 14.1.2.0

Linux系统图形化界面安装WebLogic 14.1.2.0.0版本

cnskylee的博客 838

SpringBoot3.X及SpringAi和jdk17以上版本集成MCP协议供大模型调用sse协议

MCP(Model Context Protocol,模型上下文协议)是由 Anthropic 推出的开源协议,旨在实现大型语言模型(LLM)与外部数据源和工具的无缝集成,用来在大模型和数据源之间建立安全双向的链接。目标是成为 AI 领域的“HTTP 协议”,推动 LLM 应用的标准化和去中心化。本文主要讲解SpringBoot3.X版本和jdk17版本如何集成MCP协议 后续还有一个SpringBoot2.7和jdk1.8通过solon来实现@Service。

weixin_47247523的博客 788

DP:完全背包问题

在完全背包问题中,每种物品有无限个可用,目标是在限定的背包容量内,选择物品使得总价值最大。动态规划通过将问题分解为子问题,利用子问题的解来构建最终解。完全背包问题具有最优子结构性质和重复子问题结构,非常适合用动态规划求解。通过对完全背包问题的深入探讨,我们了解了动态规划在解决这类问题中的重要性。完全背包问题在实际应用中非常广泛,例如货币兑换、资源分配和路径规划等。在解决过程中,我们学会了如何定义状态、确定状态转移方程,并通过优化空间复杂度提升算法效率。

2301_79969994的博客 1646

用 i18n 驯服标准文案:SAP Fiori elements 的 UI 文本本地化与可替换实践全景

本文系统介绍了SAP Fiori elements应用中UI文本本地化的全面解决方案。从框架层与应用层文本的分类原则出发,详细解析了标准文本替换的四步法:资源准备、键值定位、模型配置和验证部署。文章特别针对不同开发场景,提供了XML、ABAP CDS和CAP CDS三种注解方式的文本覆盖写法示例。同时深入探讨了语言回退机制、表格组件标准键覆盖等关键技术细节,并指出了实际项目中的常见问题与解决方案。通过结合官方文档和社区实践,为开发人员在不破坏框架约定的前提下,实现稳定可靠的UI文本本地化提供了完整指导。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 296

【基础算法笔记】dp(背包问题)

背包问题

Radein的博客 1602

5分钟用AI搞定顶刊级引言!掌握三段式结构+避坑要点,让你的Introduction更有说服力(附提示词)

说明你是怎么来填补这个缺口的,一句话概括你的研究,再简述你采用了什么新方法、新模型或新视角,也就是创新点,最后说明你的方案是怎么克服第二段提到的缺口的,带来了哪些贡献,注意要确保方案与第二段提到的缺口一一对应。以上三段式引言模板,是非常经典的问题导向型结构,相比传统的结构,这种结构更能吸引是审稿人的注意,希望这篇分享的模板能给在你写论文引言时,提供一点帮助。上一段写好后,就在前人研究的基础上,亮出自己的方案,借助AI说明自己的研究,用了什么新方法/框架/理论/视角来填补这个缺口的。

智能AI让学术科研更容易 745

14、方法论 - 自顶向下与自底向上的结合

本文探讨了如何将自顶向下的规范驱动方法与自底向上的组件构建方法相结合,以形成更加全面的编程理论。通过引入代数法则,简化逻辑关系、提高代码可读性并支持形式化验证,结合实际案例(如智能家居控制系统)展示了如何在设计和实现阶段确保系统的正确性和可靠性。文章还讨论了工具支持的重要性,并提出了未来发展的方向。

lstm7chronicler的博客 173

蓝桥杯DP算法——背包问题(C++)

01背包问题就是有N件物品,一个空间大小为V的背包,每个物品只能使用一次,使得背包中所装物品的价值总和最大。如图所示使用一个二维数组来存放从前i个物品中取,总体积不超过j的包中价值最大值。根据图二所示,我们可以将每次dp到的情况分为两种,一种是选择第 i 件物品,另一种是不选择第 i 件物品。

qq_63055790的博客 2969

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

算法:多重背包问题dp

多重背包问题是背包问题的又一变种,它在0-1背包和完全背包问题的基础上增加了一个限制:每种物品。解决多重背包问题的基本思路是利用动态规划,其中最直观的方法是使用二维DP数组。次,而不是只有一次(0-1背包问题)或无限次(完全背包问题)。按照以上思路,并且按照0-1背包一样的思路,进行降维优化。的情况下的最大价值。和0-1背包问题的区别在于物品。由于这种方法会导致较高的时间复杂度,时间复杂度为。的值很大时,常常需要使用其他技巧。外,还有一个最大可用数量。可以被选取的次数最多是。种物品,在不超过重量。

m0_63997099的博客 1870

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【动态规划算法(dp算法)】之背包问题

动态规划 01背包

大龄烤红薯的博客 1640

【算法】力扣- 背包问题

背包问题

qq_62775328的博客 1261

蓝桥杯备赛 week 4 —— DP 背包问题

蓝桥杯备赛 week 1 —— DP 背包问题。这篇文章主要是准备蓝桥杯竞赛同学所写,为你更好准备蓝桥杯比赛涉及的算法知识点。不知道你是否苦恼于不知算法从何学起,苦恼于网上资料稀少,或者复杂难懂,这篇文章就是帮助这部分同学的。

jupangMZ的博客 1561

DP背包问题

最近学习了动态规划,网课上大佬们讲得我怎么都听不太懂???一听不懂就想摸鱼了...所以干脆不听课了,在这里整理一下经典DP题目。 一. 01背包问题 题目:P1048 [NOIP2005 普及组] 采药 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 01背包问题中,每个物品只有一件,换句话说,每件物品只有取(1)和不取(0)两种状态。 二维数组解决方法: 原理: ——引自《算法竞赛——从入门到进阶》 表格中第一维度i:待取背包的种类,第二维度j:待取背包的容量 ..

打发人间白云的博客 2218

背包问题求解

背包问题是算法中的一个经典问题,在面试中也会遇到,但是对一般人来说还是一个比较困难的问题,本文试图探讨一下背包问题中的0-1背包问题,试图将问题变得更加简单和容易理解。本文以0-1背包问题为线索引出了其他两种背包问题,我们发现其他形式的背包问题都可以转换成0-1背包问题,然后按照0-1背包问题的方式进行解答即可。

qq_33626066的博客 1431

Acwing-基础算法课笔记之动态规划(背包问题)

01背包中的0和1指的是放与不放,而且不能出现放多个的情况,背包只能放相同物品中的一个;首先是对dijd[i][j]dij数组的解释,该数组表示的是只看前iii个物品,总体积是jjj的情况下,总价值最大是多少;有nnn件物品,每件物品的重量为wiw[i]wi,价值为cic[i]ci。现有一个容量为VVV,的背包,问如何选取物品放入背包,使得背包物品的总价值最大。其中每件物品有无穷件。既然这样,不妨像0-1背包问题那样,先写出状态转移方程,从源头上摸索。

weixin_73381974的博客 1024

【算法·MEGA-11】DP-背包问题

0-1 背包问题:每个物品只能选择一次,使用动态规划解决。完全背包问题:每个物品可以选择多次,动态规划求解。多重背包问题:每个物品可以选择一定次数,动态规划解决。分数背包问题:物品可以分割,采用贪心算法解决。多维背包问题:考虑多个约束条件,使用多维动态规划求解。不同的背包问题适用于不同的实际场景,通过合理选择算法,可以高效解决各种资源分配、优化问题。

m0_69378371的博客 1043

算法--动态规划(背包问题)

假设我们有N个物品,我们的背包的体积是V,N个物品每个物品有两个属性,分别是v体积、和w价值,或者说权重,每个物品要么不选,如果选的话,只能选一次我们的目标是:要选出一些物品,在总体积能装的下的情况下(不一定必须装满),争取价值之和最大化完全背包问题,是每个物品有无限个,每个物品都可以选无限次多重背包问题,是每个物品的个数不一样,也就是每个物品的可选次数不一样。

长安1108的博客 1320
上一篇: 【算法笔记】Kruskal/Prim算法——求解最小生成树问题
下一篇: 【算法笔记】树状数组/Binary Indexed Tree/Fenwick Tree
GoodCoder666
博客等级 码龄7年 2320粉丝 85原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值