当前位置: 首页 > news >正文

目标和 (leetcode 494

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]!!

相关文章:

  • 解决SpringCloud整合Nacos启动报Client not connected, current status:STARTING
  • [C++面试] 迭代器面试点(难点)
  • 一个KADB测试实践
  • Leetcode 378. 有序矩阵中第 K 小的元素 二分查找
  • gonet开源游戏服务器环境配置
  • leetcode127.单词接龙
  • 在 Linux下使用 Python 3.11 和 FastAPI 搭建带免费证书的 HTTPS 服务器
  • HarmonyOS开发,A持有B,B引用A的场景会不会导致内存泄漏,看这里!
  • python|exm6-1try-except结构|raise关键字|异常类型
  • Cannot find module @rollup/rollup-win32-x64-msvc
  • AES 简介 以及 C# 和 js 实现【加密知多少系列_3】
  • 鸿蒙Next开发与未来发展的变革:全场景操作系统的全新纪元
  • UE4学习笔记 FPS游戏制作10 制作UI准星
  • Linux 修改国内镜像源
  • 基于Debian搭建FTP服务器
  • 腾讯云创建DeepSeek AI应用及使用教程
  • 人工智能和量子时代的网络安全
  • 类与对象(二)——类的 6 个默认成员函数
  • 模型空间、图纸空间、布局(Layout)之间联系——CAD c#二次开发
  • Java面试第十二山!《Redis缓存》
  • ​中国超大规模市场是信心所在——海南自贸港建设一线观察
  • 瑞士联邦主席凯勒-祖特尔、联邦副主席帕姆兰会见何立峰
  • 价格周报|供需回归僵局,本周生猪均价与上周基本持平
  • 兵韬志略|美2026国防预算未达1万亿,但仍寻求“暗度陈仓”
  • 【社论】职业上新,勇于“尝新”
  • 七方面118项任务,2025年知识产权强国建设推进计划印发