动态规划 Leetcode 494 目标和

这篇具有很好参考价值的文章主要介绍了动态规划 Leetcode 494 目标和。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目标和

Leetcode 494

学习记录自代码随想录

要点:1.想到±代表其实求的是连个组合的差值,进而记left为正组合,right为负组合,则有
{ l e f t − r i g h t = t a r g e t l e f t + r i g h t = s u m \left \{ \begin{matrix} left-right=target \\ left+right=sum \end{matrix} \right . {leftright=targetleft+right=sum,从而可以推导出 l e f t = s u m + t a r g e t 2 left = \frac{sum+target}{2} left=2sum+target
2.想到以上面所求left为背包容量,得到dp[j]含义为装满背包容量j的组合方法数目;
3.求组和数目的递推公式一般为 d p [ j ] + = d p [ j − n u m s [ i ] ] dp[j] += dp[j-nums[i]] dp[j]+=dp[jnums[i]]
4.dp数组初始化时dp[0]为1,其余为0否则递推公式会无效文章来源地址https://www.toymoban.com/news/detail-845110.html

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {
        
        // 1.一加一减两种方法实际上是将数组分为两个集合left(+),right(-)
        // 则有left-right = target, 且left+right = sum, 则推出left = (sum+target)/2
        int sum = 0;
        for(int a : nums) sum += a;
        if(sum + target < 0) return 0;  // 总和小于target则无法实现结果
        if((sum + target) % 2) return 0;
        int left = (sum + target) / 2;
        // dp[j]代表背包容量为j时填满背包有dp[j]种方法
        vector<int> dp(1001, 0);
        // 2.递推公式(求组和有多少种方法一般可参考此递推公式):dp[j] += dp[j-nums[i]](对所有小于等于j的nums[i]求和)
        // 3.初始化dp数组为dp[0] = 1, 其余为0
        dp[0] = 1;  // 若dp[0]为0则所有递推结果均为0
        // 4.遍历顺序先遍历物品,再反向遍历容量

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

到了这里,关于动态规划 Leetcode 494 目标和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LeetCode】动态规划 刷题训练(一)

    点击查看: 三步问题 三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。 示例1: 输入:n = 3 输出:4 说明: 有四种走法 示例2: 输入:n = 5 输出:13 当n==1时

    2024年02月10日
    浏览(38)
  • 【Leetcode】动态规划 刷题训练(八)

    点击查看:等差数列划分 如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。 子数组 是数组中的一个连

    2024年02月11日
    浏览(39)
  • 【LeetCode】 动态规划 刷题训练(三)

    点击查看:下降路径最小和 给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线

    2024年02月10日
    浏览(39)
  • 【LeetCode】动态规划 刷题训练(九)

    点击查看:467. 环绕字符串中唯一的子字符串 定义字符串 base 为一个 “abcdefghijklmnopqrstuvwxyz” 无限环绕的字符串,所以 base 看起来是这样的: “…zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd…”. 给你一个字符串 s ,请你统计并返回 s 中有多少 不同非空子串 也在 base 中出现。

    2024年02月15日
    浏览(35)
  • 【LeetCode】动态规划 刷题训练(四)

    点击查看:按摩师 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。 示例 1: 输入

    2024年02月11日
    浏览(33)
  • 【LeetCode】动态规划 刷题训练(五)

    点击查看:粉刷房子 假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。 当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。

    2024年02月11日
    浏览(42)
  • 【LeetCode】动态规划 刷题训练(六)

    点击查看:买卖股票的最佳时机 III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 示例 1: 输入:p

    2024年02月11日
    浏览(29)
  • 【LeetCode】动态规划 刷题训练(二)

    点击查看:不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 示例 1: 输入:m = 3, n = 7 输出:28 示例

    2024年02月10日
    浏览(33)
  • LeetCode - 494 目标和

    目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 494. 目标和 - 力扣(LeetCode) 题目描述 给你一个整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 \\\'+\\\' 或 \\\'-\\\' ,然后串联起所有整数,可以构造一个 表达式 : 例如,nums = [2, 1] ,可以在 2 之前添加

    2024年02月12日
    浏览(35)
  • 【LeetCode】494.目标和

    给你一个非负整数数组  nums  和一个整数  target  。 向数组中的每个整数前添加  \\\'+\\\'  或  \\\'-\\\'  ,然后串联起所有整数,可以构造一个  表达式  : 例如, nums = [2, 1]  ,可以在  2  之前添加  \\\'+\\\'  ,在  1  之前添加  \\\'-\\\'  ,然后串联起来得到表达式  \\\"+2-1\\\"  。 返回可以

    2024年02月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包