目标和 (leetcode 494

ops/2025/4/2 5:07:17/

leetcode系列

文章目录

  • 一、核心操作
  • 二、外层配合操作
  • 三、核心模式代码
  • 总结


一、核心操作

  1. 确定dp[i][j]的含义:i为物品容量(数字),j为背包容量,dp[i][j]为用前i个物品装满容量为j的背包的方法数量
  2. 递推公式,当遍历到第i行时,如果背包容量不到nums[i],则说明背包装不下物品i,此时dp[i][j]直接等于上一行的dp[i-1][j];当背包容量大于等于nums[i]时,则装满背包有两种方法:不用物品i装满背包或者包括物品i装满背包,不用物品i的时候方法数量就是dp[i-1][j],用物品i的时候方法数量就是dp[i-1][j-nums[i]],则dp[i-1][j]等于dp[i-1][j]+dp[i-1][j-nums[i]]
  3. 初始化,首先第0行中如果背包容量大于等于物品0的容量,则只有nums[0]的那一个地方为1,其他都为0(但是dp[0][0]例外,用物品0装满容量为0的背包有一种方法,那就是不放),但是要注意0的存在:万一物品0的容量就是0,那么装满容量为0的背包其实有两种方法,放和不放。然后第0列的初始化要看物品容量为0的个数,即为 2的 物品容量为0的个数 次方,这样其实就涵盖了第0个物品容量为0的情况
  4. 遍历顺序:i从1开始,j从1开始

提示:小白个人理解,如有错误敬请谅解!

二、外层配合操作

  1. 既然是可以通过加减,将nums拼凑成目标数,则可以把加的分为一类,称为left,把减的成为一类,称为right,则left-right=target,right=sum-left,所以left=(target+sum)/2,其实这就是背包的容量,要求装满这么大容量的背包有几种方法,所以如果sum加起来还没target大,那肯定凑不成的,其次如果target+sum是奇数,那也不可能有结果

三、核心模式代码

代码如下:

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {int sum=0;for(int i=0;i<nums.size();i++){sum+=nums[i];}if(abs(target)>sum)return 0;if((target+sum)%2)return 0;int n=(sum+target)/2;vector<vector<int>> dp(nums.size(),vector<int>(n+1,0));if(nums[0]<=n) dp[0][nums[0]]=1;int count=0;for(int i=0;i<nums.size();i++){if(nums[i]==0)count++;dp[i][0]=pow(2,count);}for(int i=1;i<nums.size();i++){for(int j=1;j<=n;j++){if(j<nums[i])dp[i][j]=dp[i-1][j];else dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i]];}}return dp[nums.size()-1][n];}
};

总结

  1. 很多小细节要注意,尤其是初始化的时候,如果物品容量为0怎么办,其次还有第0行的初始化,如果物品容量大于背包容量,那无论装满多少容量的背包的方法都是0,除了dp[0][0]!!

http://www.ppmy.cn/ops/167521.html

相关文章

软考系统架构设计师考试学习和考试的知识点大纲,覆盖所有考试考点

以下是软考系统架构设计师考试的知识点大纲&#xff0c;覆盖所有官方考点&#xff0c;分为基础知识、核心技术、系统设计、案例分析、论文写作五大模块&#xff0c;帮助系统性学习和备考&#xff1a; 一、基础知识模块 计算机组成与体系结构 计算机硬件组成&#xff08;CPU、内…

实时内核稳定性问题 - 压测异常重启问题

日志现场 [ 8613.122850][ 87] Unable to handle kernel paging request at virtual address dead000000000100 [ 8613.122862][ 87] Internal error: Oops: 96000004 [<

CPP从入门到入土之类和对象Ⅱ

一、六大默认成员函数 默认成员函数是用户没有显式实现&#xff0c;编译器自动生成的成员函数。 一个类&#xff0c;我们在不写的情况下&#xff0c;编译器会默认生成六个默认成员函数 本文详细介绍构造函数和析构函数 二、构造函数 构造函数虽名为构造函数&#xff0c;但是…

一个简单C程序

基本示例&#xff0c; 这里有一个经典的“Hello, World!”程序供参考&#xff1a; c #include <stdio.h> int main() { printf("Hello, World!\n"); return 0; } 现在来分析一下上面的实例程序。 1. #include 指令 实例代码中的第一行&#xff1a; #incl…

Oracle OCP认证没落了吗?

Oracle OCP认证没落了吗? Oracle的OCP认证是数据库领域必考的一个认证&#xff0c;但随着国产化的发展&#xff0c;国内很多企业开发了自己的数据库产品&#xff0c;这种情况对很多人造成了错误的认识&#xff1a;OCP被淘汰了吗?不然&#xff0c;从行业需求、技术趋势、认证体…

【程序人生】成功人生架构图(分层模型)

文章目录 ⭐前言⭐一、根基层——价值观与使命⭐二、支柱层——健康与能量⭐三、驱动层——学习与进化⭐四、网络层——关系系统⭐五、目标层——成就与财富⭐六、顶层——意义与传承⭐外层&#xff1a;调节环——平衡与抗风险⭐思维导图 标题详情作者JosieBook头衔CSDN博客专家…

鸿蒙app 开发中 如何 自己定义 选中图库照片或者视频的逻辑

使用找个组件 可以 自己书写 选中照片或者视频的逻辑

大语言模型的长思维链推理:综述(下)

25年3月来自哈工大、中南大学、香港大学和复旦大学的论文“Towards Reasoning Era: A Survey of Long Chain-of-Thought for Reasoning Large Language Models”。 OpenAI-O1 和 DeepSeek-R1 等推理大语言模型 (RLLM) 领域的最新进展&#xff0c;已在数学和编码等复杂领域展示…