完全背包问题

01背包问题和完全背包问题 01背包 01背包字面意思来看0就是不拿,1就是拿,且每次只能拿一个物品放入背包。 开二维数组的状态方程: 此情景为往固定容量的背包里装物品,使包内物品为最大价值 实际上就是在每个物品的基础上,遍历所有可能的背包空间,如果放得下去就比较放与不放对价值的影响 一维数组的状态方程: ... 阅读详情

前言

没有接触过01背包的不推荐先搞别的背包问题,思路可能会不清楚或绕在一起,效果反而不好,建议先理解透彻01背包:01背包问题

完全背包问题

样题:完全背包问题

先来分析一下完全背包问题与01背包问题的相同点和不同点:

01背包完全背包
每件物品只有 1 1 1件每种物品有 ∞ \infty ∞(无限,不懂数学的小伙伴们要加油了)件(并不是真的有 ∞ \infty ∞件,后面会讲到代码中的上限)
每件物品有两个属性:重量 w w w和价值 c c c每种物品有两个属性:重量 w w w和价值 c c c
递推方式:逆推递推方式:顺推,以后会讲为什么

思路

好啦,那么我们从这里开始讲解思路。
首先是输入和初始化部分 (只要有手就行),这部分我就不多做赘述了。

之后是重点。

核心代码思路(朴素版)

这个其实就是吧原本的完全背包换成了01背包来求解。
首先我们来讨论在上文表格中说的 “并不是真的有 ∞ \infty ∞件”。事实也确实是这样,它是有上限和下限的。
下限我们都很清楚,就是 0 0 0。
上限呢?
It depends.(这要看情况而定)
好了,有点扯远了( ̄ー ̄)。其实上限有一个限制条件:那就是物品总重量不超过 j j j,用条件语句写出来就是: k × w [ i ] ≤ j k\times w[i]\le j k×w[i]≤j,这里的 k k k指当前物品的件数,由下限一直增加到上限。

循环结构

// 外面的东西
for (int k = 0; k * w[i] <= j; ++k) {
	// 状态转移方程
}
// 输出答案

状态转移方程

跟01背包没啥区别,但是要注意减去的重量是 k k k倍的,增加的价值也是 k k k倍的。
状态转移方程如下:
d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − k × w [ i ] ] + k × c [ i ] ) dp[i][j]=max(dp[i-1][j],dp[i-1][j-k\times w[i]]+k\times c[i]) dp[i][j]=max(dp[i−1][j],dp[i−1][j−k×w[i]]+k×c[i])

代码

#include <iostream>
using namespace std;

int main()
{
    int n, m;
    cin >> m >> n;
    const int N = n + 1, M = m + 1;
    int w[N], c[N], dp[N][M];
    for (int i = 1; i < N; ++i) cin >> w[i] >> c[i];
    for (int i = 0; i < N; ++i)
        for (int j = 0; j < M; ++j)
            dp[i][j] = 0;
    for (int i = 1; i < N; ++i)
        for (int j = m; j >= 1; --j)
            for (int k = 0; k * w[i] <= j; ++k)
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - k * w[i]] + k * c[i]);
    cout << dp[n][m];
}

核心代码思路(优化版)

压缩数组

这次我们还是通过压缩数组和状态转移方程来优化。
实际上我们可以顺着递推,也就是需要覆盖数据。
为什么呢?因为我们希望放的东西累加起来,所以不能使用旧数据,而是使用累加过的新数据。
这样就完成了压缩数组。

状态转移方程式(优化版)

状态转移方程如下:
d p [ j ] = m a x ( d p [ j ] , d p [ j − w [ i ] ] + c [ i ] ) dp[j]=max(dp[j],dp[j-w[i]]+c[i]) dp[j]=max(dp[j],dp[j−w[i]]+c[i])
是的,你没有看错!
这就是妥妥的01背包状态转移方程!!!
可是注意区别:

01背包完全背包
逆推,使用旧数据,不会累加价值顺推,使用新数据,会累加价值

代码(优化版)

#include <iostream>
using namespace std;

int main()
{
    int n, m;
    cin >> m >> n; //size, numbers of things
    const int N = n + 1, M = m + 1;
    int w[N], c[N], dp[M];
    for (int i = 1; i < N; ++i) cin >> w[i] >> c[i];
    for (int i = 0; i < M; ++i) dp[i] = 0;
    for (int i = 1; i < N; ++i)
        for (int j = w[i]; j <= m; ++j) dp[j] = max(dp[j], dp[j - w[i]] + c[i]);
    cout << "max=" << dp[m];
}

世界因为代码变短、变有用、变漂亮、变得能够输出正确答案而明亮起来 (*´゚∀゚`)ノ


有如果任何问题或建议欢迎在评论区指出(~ ̄▽ ̄)~

实测有效!YOLOv8融合EMA注意力机制后,在无人机航拍目标检测中的性能提升对比 本文详细介绍了YOLOv8融合EMA注意力机制在无人机航拍目标检测中的性能提升效果。通过多尺度特征融合和通道-空间双重注意力机制,EMA模块显著提升了小目标检测的准确率,mAP@0.5平均提升4.2%,同时保持推理速度基本不变。文章还提供了模型定制、训练技巧和实际部署优化的全流程指南。 阅读详情

相关推荐

零基础用AHK操作Excel:从数据读取到自动填写(附完整脚本解析)

本文为零基础用户详细介绍了如何使用AutoHotkey(AHK)通过COM接口高效操作Excel,实现从数据自动读取到填写的完整自动化流程。文章包含完整的脚本解析、环境搭建指南、核心代码逐行讲解以及实际应用案例,帮助办公人员大幅提升数据处理效率,告别重复劳动。

weixin_29202213的博客 553

背包问题分析代码详解【01背包+完全背包+多重背包】

由于f[i,j-v]中多了一项f[i-1,j-(s+1)v]+sw,所以f[i-1,j-v]+w,f[i-1,j-2v]+2w,f[i-1,j-3v]+3w,…f(i,j−v)=max(f[i,j−v],f[i,j−2v]+w,⋯,f[i,j−(s+1)v]+sw)(滑动窗口已满)f(i,r+(s+1)v)=max(f[i,r+(s+1)v],f[i,r+sv]+w,⋯,f[i,r+v]+sw)(滑动窗口已满)简言之,在j........................

weixin_61907955的博客 4295

STM32F407驱动OV2640摄像头:从SCCB协议到I2C模拟的保姆级避坑指南

本文详细介绍了STM32F407驱动OV2640摄像头的完整流程,重点解析SCCB协议与I2C的关键差异,并提供GPIO模拟实现方案。通过实战案例和调试技巧,帮助开发者避开常见陷阱,实现稳定的图像采集功能。

weixin_28700411的博客 345

背包总结——0-1背包及完全背包问题总结及代码模板

背包总结 背包问题通常是多种物品有多个属性,且已知条件为某属性被受限,求另一属性的最大/最小/等于/存在不存在。以0-1背包为例解释:n个物品具有的属性为重量和价值,其中总重量C将重量的属性限制住,求最大价值,即求另一属性的特征。 针对背包问题: 1、先判断属于0-1背包还是完全背包。 2、看是求最大值/最小值/等值/是否存在/排列/组合(排列/组合问题通常出现在完全背包中)。 确定了背包类型及要求的问题后,即可下手做题。 1、0-1背包 0-1背包是指物品只能使用一次,故通常其状态方程为: dp[i][j

baymax的博客 589

3D Slicer:从入门到精通(二)——入门指南

本篇文章包含开始使用3D Slicer所需的信息,包括如何安装和快速开始使用基本功能,以及在哪里找到更多信息。

walt3433的博客 2万+

Brainstorm简单分析近红外数据(fNIRS)(一)

Brainstorm分析fNIRS数据

weixin_43604817的博客 1351

完全背包问题总结

完全背包问题与01背包问题有很密切的关系,关于01背包可以看这篇文章:01背包问题总结我这里面写的代码将主要采用上面文章提到的一维dp的方法。完全背包是指有一个有固定容量的背包,装一些物品使得背包中的价值和最大,每种物品有无数个,应如何装。与01背包的区别就在于完全背包的每种物品数量是无限的,可以重复装某一物品。所以每次装某种物品时,需要考虑装0个,1个,2个…该物品的情况,直到装不下。代码为: 如果用一维数组来写的话应该为这样: 这种写法可见上面的文章,注意这里与01背包的一维写法不同的是容量是由大到小遍

qq_46514141的博客 565

实战:RK3568 Android14 集成 AP6212A WiFi/BT 二合一模块

AP6212A 的集成在 RK3568 上非常成熟。只要电源、32K 时钟、SDIO 线序、UART 流控这四点硬件没问题,软件上主要是 DTS 对应的 GPIO 别填错即可。希望这篇博文能帮你一次点亮 WiFi 和蓝牙!

qq_33427070的博客 1448

DP:完全背包问题

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

2301_79969994的博客 1646

企业数字化转型解决方案架构设计:一个五维全景视角

本文系统探讨了企业数字化转型的架构设计框架,提出五维协同模型:企业架构作为战略罗盘,业务架构聚焦价值创造,应用架构实现能力载体,数据架构提供智能燃料,技术架构奠定基础支撑。文章深入分析了各架构域的核心要素、设计原则及相互关系,并指出数字化转型需通过渐进路径,结合战略引领、技术赋能和组织变革,构建有机统一的架构体系。该框架为企业应对数字化复杂性提供了系统性方法论,强调从整体视角实现技术与业务的深度融合。

金牌架构师 1256

ICLR 2025 | MambaPEFT: 探索针对Mamba的参数高效微调方法

通过利用海量数据构建大型模型,基于Transformer的模型生态系统已逐步确立。参数高效微调(PEFT)是一项至关重要的技术,它能以最低成本将这些模型应用于下游任务,同时实现高效的性能表现。最近,基于状态空间模型(SSM)的Mamba模型作为Transformer的潜在替代方案受到了广泛关注。尽管已经提出了许多基于Mamba的大规模模型,但如何高效地将预训练的Mamba模型应用于下游任务仍有待研究。在本文中,作者对适用于Mamba的PEFT方法展开了探索性分析。

小白学视觉 326

【动态规划】完全背包问题应用

【动态规划】完全背包问题应用

fight_p的博客 3065

携程滑块、点选验证码登录识别逆向

本文分析了携程登录系统的风控机制,主要包含三种验证场景:无验证码、滑块验证码和二次图标点选验证码。通过跟踪risk_inspect风控接口,发现验证流程采用标准AES加密,需提交设备指纹等加密信息。当触发验证码时,需额外提交包含轨迹坐标的verify_msg参数及token/rid参数。最终通过风控检测后,需使用一致的指纹参数和验证token完成加密登录。文章强调所有分析仅用于学习,代码实现需确保符合法律规范。

码王吴彦祖的博客 1100

完全背包问题(动态规划)

完全背包问题 题目: 有 N 种物品和一个容量为 V 的背包,每种物品都有无限件可用。第 i 种物品的费用是 c[i],价值是 w[i] 。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 一、验证动态规划求解的可行性 这个问题可以不可以像01背包问题一样使用动态规划来求解呢?来证明一下即可。 首先,先用反证法证明最优化原理: 假设完全背包...

但行好事,莫问前程 6143

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

动态规划——完全背包问题

聪明人都会点进来学习!!动态规划看这一篇就够了!!!本文详细讲解了动态规划的核心思路(配有图片),还以经典问题——完全背包问题为例,先从基础解法开始讲解思路,再一步步优化(一维数组),带有完整代码(有详细注释),对于难以理解的地方还会举例讲解,还会和01背包问题对比思考,赶紧点进来学习吧!!!

yourgrandfather_的博客 3946

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

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

九大背包问题专题--完全背包问题(详解,最优解)

2.完全背包问题 和01背包问题的区别: 01背包1件物品只能选或者不选 完全背包问题:1件物品可以重复选多次,只要不超过总体积 题目: 问题: 有N件物品和一个容量是V的背包。 第i件物品的体积是vi,价值是wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包的容量,且价值最大。 输入格式 第一行有两个整数,N,V用空格隔开,分别表示物品数量和背包容积。 接下来有N行,每行两个整数vi...

gl620321的博客 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

01背包问题&&完全背包问题

01背包问题 问题描述:有N件物品,每件物品的重量为w[i],价值为c[i],现有一个容量为V的背包,问如何选取物品放入背包中,使得物品的总价值最大。其中每种物品都只有1件。 输入: 5 8 //物品数 最大容量 3 4 //每件物品的重量 每件物品的价值 5 5 1 2 2 1 2 3 输出:10 完全背包问题 问题描述:有N件物品,每件物品的重量为w[i],价值...

jelly的博客 1798

背包问题/完全背包问题全解

核心代码 2:res[i][j] = Math.max(res[i-1][j],res[i-1][j-w[i]]+v[i]) 比较上一步(i-1)的最优方案,和这一步的最优方案谁的钱最多。k++) 就是可以加个w[i]物品,思想差不多,k 一开始是取0的意思是让res[i][j]进入else循环,得出res[i][j] = res[i][j-1](至少先继承一下前辈,如果k=1时不满足循环条件会没有数据),其他要注意的就是前面说的核心代码要注意乘以k的倍数。本人水平欠佳,望多多大佬指点!

qq_62691586的博客 675

leetcode完全背包问题(C++)

完全背包问题是基于01背包问题的变形,所以请务必先学习完01背包问题,再来学习完全背包问题01背包问题与01背包最大的不同点,就在于完全背包问题中的物品可以选择无限多个,把无限多种情况浓缩成一种即能迎刃而解了。

2302_80297338的博客 1362
上一篇: 01背包问题
下一篇: 多重背包问题
peter_code
博客等级 码龄5年 41粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值