01背包问题的变种问题(奇行种)

01背包问题及变种详解 经典的背包问题九讲文档,包含了01背包及其变种的详细解释。 立即下载

01背包问题的转化类型

494. 目标和

难度中等796

给你一个整数数组 nums 和一个整数 target 。

向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :

  • 例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。

返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

示例 1:

输入:nums = [1,1,1,1,1], target = 3
输出:5
解释:一共有 5 种方法让最终目标和为 3 。
-1 + 1 + 1 + 1 + 1 = 3
+1 - 1 + 1 + 1 + 1 = 3
+1 + 1 - 1 + 1 + 1 = 3
+1 + 1 + 1 - 1 + 1 = 3
+1 + 1 + 1 + 1 - 1 = 3

示例 2:

输入:nums = [1], target = 1
输出:1

思路如下:也就是我们将数组分为左右两个部分 left 和 right 那么sum=left+right.所以如果我们设加法总和为x那么减法总和就是sum-x 那么我们要求的就是x-(sum-x)=target所以 x=(target+sum)/2

这时候就变成了背包问题

也就是,装满容量为x的背包最多有几种方法

解题方法

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {
        int sum =0;
        for(auto value: nums) {
            sum+=value;
        }

        if((target+sum)%2!=0) {
            return 0;
        } else {
            sum=(target+sum)/2;
        }

        vector<int> dp(sum+1,0);
        // 初始化
        dp[0] = 1;

        for(int i=0;i<nums.size();i++) {
            for(int j=sum;j>=nums[i];j--){
                dp[j]+=dp[j-nums[i]];
            }
        }

        return dp[sum];


    }
};
1049. 最后一块石头的重量 II

难度中等197

有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。

每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:

  • 如果 x == y,那么两块石头都会被完全粉碎;
  • 如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。

最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0。

示例 1:

输入:stones = [2,7,4,1,8,1]
输出:1
解释:
组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],
组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],
组合 2 和 1,得到 1,所以数组转化为 [1,1,1],
组合 1 和 1,得到 0,所以数组转化为 [1],这就是最优值。

示例 2:

输入:stones = [31,26,33,21,40]
输出:5

示例 3:

输入:stones = [1,2]
输出:1

这个其实也是分成为两个堆,要使得碰撞之后所剩下的最小那么就是要劲量使得左右两边的石头重量一致。

所以转换成背包问题就是在背包容量为sum/2的情况下放入石头最重的重量,这就是一个典型的背包问题

在计算target的时候,target = sum / 2 因为是向下取整,所以sum - dp[target] 一定是大于等于dp[target]的,那么碰撞以后的重量就是sum-dp[target]-dp[target]。

class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        int sum =0;
        for(auto value : stones) {
            sum+=value;
        }

        int bgsize = sum/2;

        vector<int> dp(bgsize+1,0);
        dp[0]=0;  // 代表含义,容量为0的时候有一种放置方法,就是什么都不放

        for(int i=0;i<stones.size();i++) {
            for(int j=bgsize;j>=stones[i];j--) {
                dp[j] = max(dp[j],dp[j-stones[i]]+stones[i]);
            }
            // for(auto value: dp) {
            // cout<<value<<" ";
            // }
            //     cout<<endl;

        }
       
        

        return sum-dp[bgsize]-dp[bgsize];

    }
};
WinCC ActiveX控件“许可证缺失”故障排查:从注册表修复到系统兼容性全解析 本文深入解析WinCC ActiveX控件报错“未找到许可证信息”的根本原因与解决方案。核心在于系统注册表中控件的设计时许可证密钥丢失或损坏。文章提供了从手动修复注册表、排查64位系统兼容性,到预防性环境部署的全流程专业指南,帮助工程师彻底解决这一常见故障。 阅读详情

相关推荐

InTouch历史报警与操作记录高效查询控件V4.0实战指南(一键下载即用)

本文详细介绍了InTouch历史报警与操作记录高效查询控件V4.0的实战应用。该控件针对原生AlmDbViewCtrl控件的查询效率低下、功能单一等问题,提供了智能查询、可视化统计、视图定制和一键导出Excel等强大功能,旨在帮助工程师快速处理海量历史数据,大幅提升工控运维效率。

g9h0i1的博客 960

【动态规划算法】背包问题——0/1背包问题,多目标优化背包问题详解与示例

背包问题是动态规划中的一个经典问题,通常有两种主要变种:0/1 背包问题和背包问题(Fractional Knapsack Problem)。这里我们先详细解释0/1背包问题再介绍背包问题的变种。

qq_35831906的博客 1万+

Mac 环境配置jdk、Maven

3、终端打开配置jdk时候建好的脚本文件: open -e .bash_profile。4、查看maven是否安装成功和系统能不能识别maven/mvn命令:⬇️。输入⬇️并保存: 其中第一行JAVA_HOME替换为自己下的jdk路径。,安装编译好的二进制版本,具体安装zip还是tar.gz我看的。5、查看jdk是否安装成功和系统能不能识别java命令:⬇️。至此,我的Mac系统的环境配置jdk、Maven完成!然后就发现我的maven命令还是没作用,不识别,下载后直接安装即可,很快,点几下就OK了。

weixin_42416791的博客 4402

变种 背包问题_01背包及其变种(物品无限背包、恰好装满背包)

一、01背包问题01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为C1,C2,…,Cn,与之相对应的价值为W1,W2,…,Wn.求解将那些物品装入背包可使总价值最大。动态规划:1) 子问题定义:F[i][j]表示前i件物品中选取若干件物品放入剩余空间为j的背包中所能得到的最大价值。2) 根据第i件物品放或不放进行决策其中F[i-1][j]表示前i-1件物品中选取若干件物品放入剩余...

weixin_39603604的博客 1572

保姆级教程:在Windows 11上用VSCode和Conda搞定Depth-Anything-3(含常见报错修复)

本文提供在Windows 11系统上使用VSCode和Conda配置Depth-Anything-3的完整教程,涵盖环境搭建、依赖安装、常见报错修复及深度图生成实战。特别针对CUDA与PyTorch版本匹配、Hugging Face镜像加速等关键问题提供解决方案,帮助开发者高效实现计算机视觉中的深度估计应用。

weixin_30338481的博客 347

2025东方财富笔试考什么?cata能力测评攻略|答题技巧真题分享

4月10日-4月20日 专业笔试(行测+金融知识混合双打) 4月25日-5月10日 面试车轮战(AI面+半结构化+压力面) 5月15日起 Offer发放(谈薪必杀技:对标同花顺/雪球)这里不仅是金融极客的乐园,更是**“年薪30万管培生计划”**的主战场——你将用代码重构K线,用算法预判市场,成为资本市场的“数字先知”。东方财富,中国金融信息服务领域的“隐形冠军”,以**“金融数据+互联网”双擎驱动**,打造了覆盖证券、基金、期货的全生态交易平台。:• “我总坚持自己的方案”(HR:团队毒药!

Dgntsj的博客 3262

背包9讲——01背包问题及变种题目

01背包问题经典题目基本思路空间优化变种题目 力扣上刷了快200道题了,动态规划的题也做了很多,但是发现自己始终不得其精髓,有些奇奇怪怪的题可以转化为动态规划问题,但是没有经过系统训练就是不知道,就算看到答案也是看不懂; 网上类似的讲解很多很多,我这里只是总结其他人的观点,再融入自己见解,主要目的是对学习过程进行记录,而不是搞出一些新的知识点;欢迎各位能在我理解的基础上更进一步,总结出自己的学习方法和思路; 经典题目 有容量为n的容器。有很多种物体,第i件物品对应的体积和价值分别是Vi及Wi,每种物品仅有一

weixin_42034081的博客 1015

半导体设备隔振必看:如何用天棚阻尼PID控制实现VC-C级振动抑制(含SIMULINK模型)

本文深入探讨了在半导体精密制造中,如何运用天棚阻尼PID控制算法实现VC-C级振动抑制。通过构建高保真单自由度仿真模型,详细解析了从算法原理、SIMULINK实现到参数整定的全链路方案,并针对谐波扰动提供了陷波滤波器设计方法,为工程师提供了从仿真到实践的完整主动隔振技术指南。

pz89012345的博客 538

背包问题python实现_01背包问题笔记:4个关键点以及Python实现

01背包问题:其中0-1背包问题是最基本的问题,其问题描述如下:给出n物体珠的重量和其价值,将他们装入一个固定大小的背包,最多能装入的总价值有多大?之所以叫0-1背包,就是因为n个物品,每个只有一件,只有装包/不装包两种状态,即0-1问题。理解01背包有几个点理解背包问题的描述,如图,将有价值和重量的物体,放入固定大小的背包。算出最大价值理解01背包问题的表格,假设有a,b,c,d,e五个物体,其...

weixin_39622710的博客 343

Android 自动亮度

/则需要从BrightnessConfigure类中读取两个数组源:config_autoBrightnessLevels和config_autoBrightnessDisplayValuesNits。) 或知道其在DisplayPowerController()构造的时候初始化的。曲线设置好了,就应该扔代码里跑起来,模型建起来了,这个过程是咋样的呢?//它将负责曲线的创建,自动背光值的计算等。通过搜索配置关键词(

Android 1485

遇到问题--OpenClaw--API rate limit reached. Please try again later429 您的账户已达到速率限制,请您控制请求频率

OpenClaw调用glm-4.7-flash模型时触发智谱AI平台429速率限制错误。分析发现当前重试策略采用固定间隔(7-11秒)导致连续失败,且未记录关键响应头信息。解决方案分三步:1)开启响应头日志获取配额详情;2)将重试策略改为带抖动的指数退避(初始1秒,最大60秒);3)在网关层实现令牌桶限流主动控制请求频率。需特别注意令牌配额(TPM)可能比请求次数(RPM)更早触达限制。

直到世界的尽头 2620

【动态规划】【01背包 vs 01背包变种】 LeetCode 3180. 执行操作可获得的最大总奖励 I

有 N 件物品和一个容量是V的背包。每件物品只能使用一次。第 i 件物品的体积是 ci,价值是 vi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。这个题的价值主要在于怎么去抽象成01背包问题;时间上可以过,但是空间炸了;

风亦吹 422

【RT-DETR涨点改进】全网独家首发、特征融合改进篇 | AAAI 2026 | 引入CDEM交叉动态增强模块,双向引导和融合,在低光图像增强中有效提升了图像的亮度,提升小目标和暗目标的检测准确率

本文提出了一种基于CDEM(交叉动态增强模块)改进的rtdetr网络模型,有效提升了在低光和复杂环境下的目标检测性能。CDEM模块通过动态增强亮度与色彩特征,改善图像输入质量,增强细节和对比度。该模块具有轻量级结构,易于集成到现有模型中,能够显著提升小目标和暗目标的检测准确率与鲁棒性。文章详细介绍了CDEM模块的结构原理、实现方法,并提供了完整的代码实现和配置指南,包括三种改进版本的YAML配置文件。实验结果表明,该方法在图像增强和目标检测任务中均取得了优异性能。

Ai缝合怪、助力小伙伴高效发论文 144

每日一练——从长度为n的数组里选出m个数使和为固定值sum

这个问题是我从leetcode上一道问题所想到的,原题:如果是从数组中选出2个数相加使之成为固定的数sum,这当然很简单,把数组中的数字遍历一遍,判断另一个数字是否也在数组中即可。代码如下。 vector twoSum(vector& nums, int target) { vector result; map cache;//第一个为数字,第二个为下标

千里之行,始于足下 2万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

变种 背包问题_背包问题(Knapsack)全解析

导读背包问题(Knapsack Problem) 是动态规划中非常经典的一类,一般的解题思路是:状态为前 i 中物品在容量为 j 的背包下,最多可以装的物品总价值,然后遍历物品和背包容量,根据之前的状态不断更新当前状态。但是这里面仍然有不少的细节问题,如:背包问题的时间复杂度是多少(注意背包问题是NP完全问题)?如何做状态压缩?二重循环的顺序问题,为什么一定是先循环物品,后循环容量?当背包的容量非...

weixin_39962153的博客 1753

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

01背包、完全背包问题几种变式总结,以及多重背包、组合背包模板

装满背包的方法(排列、组合);最少硬币、最大价值;二维背包;多重背包模板及其二进制优化;组合背包模板

m0_74758366的博客 1625

动态规划经典问题:背包问题的五种变种解析

背包问题是动态规划中的经典问题,在实际应用中存在多种变种。本文将深入解析五种常见的背包问题变种,包括恰好装满背包、方案总数、最优方案数、具体方案以及字典序最小的具体方案。 ## 1. 恰好装满背包的最大价值 ### 问题定义 在给定背包容量和物品重量、价值的情况下,要求**恰好装满背包**时能获得的最大价值总和。 ### 关键思路 与普通背包问题不同,恰好装满背包需要在初始化时进行特殊处理:...

gitblog_01160的博客 512

动态规划——01背包问题

01背包问题及其各种变种

m0_73693552的博客 1620

1298 FORZA David Beckham

经典01背包问题,没有什么陷阱,唯一要求就是要优化空间复杂度!下面是关于01背包的讲解: 01背包问题是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是: f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]} 这个方程非常重要,...

weixin_30653023的博客 191

0-1背包问题的变种

最简单的思路是,由于物品是可以无限使用的,但是背包的容量是有限的,所以,其实每个物品可以取到的数量是有最大值的。换句话说,可以将这个可以无限使用的物品的背包问题,转换成一个有限使用的物品的背包问题,只不过此时在选取的物品列表中,很多物品是重复的。只此而已,这是一个解决思路。更进一步,其实可以优化这个方案,这是因为,对于任意一个数字而言,都可以通过一个二进制码来表示,所以,对于这种同样的物品不...

nicolelili1的专栏 1134

变种 背包问题_leetcode 题解 (0-1 背包问题)

leetcode 题解 (0-1 背包问题)主要介绍 0-1 背包问题, 及一些 leetcode 题解0-1 背包问题定义有一个背包, 他的容量为 C(Capacity). 现在有 n 中不同的物品, 编号为 0...n-1, 其中每一件物品的重量为 w(i), 价值为 v(i). 问可以向这个背包中盛放哪些物品, 使得在不超过背包容量的基础上, 物品的总价值最大.解题思路这类组合问题, 我们都...

weixin_31653971的博客 366

【动态规划】背包问题详解

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

qq_73176808的博客 1845

动态规划学习-【0-1背包问题的优化和变种】

0-1背包问题的基本描述和解题算法请看: 动态规划学习-【0-1背包问题】 上面这篇文章我们已经得出0-1背包问题的状态转移方程: F(n, C)考虑将n个物品放进容量为C的背包,使得价值最大: F(i, C) = max( F(i - 1, C), v(i) + F(i - 1, C - w(i))) 1. 空间复杂度为:O(2 * C) 根据状态转移方程,我们可以分析出来,第i...

Microstrong 3160

算法Project(变种背包问题)

问题描述: 假设有n个商店和m位顾客,我们希望计算得到: (1)开放那些商店 (2)安排哪位顾客去哪位商店 来使得开销最小。 其中:如果商店有安排到至少一位顾客,则商店需要开放营业,而这需要开销opening cost(每个商店的opening cost不同),另外安排某位顾客去某位商店的这一过程也需要开销assigning cost,且因商店的不同和顾客的不同而变化。 也即: 总开销...

chent86的博客 739

经典背包问题

1、01背包问题 暴力做法 #include <iostream> using namespace std; const int N = 1100; int n,m; int v[N],w[N]; int f[N][N]; int main(){ cin>>n>>m; // n代表4个物品,m代表背包容量是5 for(int i = 1; i <= n; i ++) cin>>v[i]>>w[i]; .

m0_62664599的博客 403

HDU 2126

如有错误,欢迎大神指出! 这又是一道变种的01背包问题,可以加多一维数组代表方案。 解释在代码里面,接下来ac code: #include #include #include #include #include #include #include #include #include #include #include #include #in

Stray_Lambs的博客 470

01背包变种(碎碎念...自用)

晚上看了一道题叫倍数问题 利用了01背包的方法来处理选取3个数满足3数之和对k取余为0的条件并且3个数之和最大,求出这个最大值。 看了这道题后突然发现自己只会最朴素(tu)的01背包 也就是还停留在从n件物品中选取物品装入容量为v的背包使总价值最大的01背包…只会敲这样的模板 而没有真正思考过可以利用01背包来解决的类似的其他问题。 之前是从前n件物品中选或不选物品 所以在第一层循环的时候已经遍历过了n件物品。 而这个题是从做过处理的n个数中选取3个,使满足余数条件 所以做法是每挑出一个数对它进行两层循环,

qq_45302640的博客 698
上一篇: 最长公共子串
下一篇: std::cin详解
黑猫爱小鹿
博客等级 码龄8年 1万+粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值