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

154、【动态规划】leetcode ——494. 目标和:回溯法+动态规划(C++版本)

题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
原题链接:494. 目标和

解题思路

(1)回溯法

本题的特点是nums中每个元素只能使用一次,分别试探加上nums[index]和减去nums[index],然后递归的遍历下一个元素index + 1

class Solution {
public:int res = 0;void backtracking(vector<int>& nums, int target, int index) {if(index == nums.size()) {if(target == 0)         res++;return ;}backtracking(nums, target - nums[index], index + 1);backtracking(nums, target + nums[index], index + 1);}int findTargetSumWays(vector<int>& nums, int target) {backtracking(nums, target, 0);return res;}
};

(2)动态规划

本题中的数都为非负数,目标要求是选取组成正数的数与负数的数,让其和为target,因此我们可以将这个题中的数划分为两个集合,一个是要组成正数的集合,设容量为pos,一个是要组成负数的集合,设容量为neg

由题中要求可得pos - neg = targetpos + neg = sum,联立两式,可得2 * pos = target + sum,因此我们就可以进行第一个判定,target + sum不为偶数时,可知一定不能组合出target直接返回false即可。当为偶数时,我们要找到可以组成pospos = (target + sum) / 2)的组合。问题就可以转变为,当背包容量为pos时,选取nums里的数,有多少种组合方式可填满背包。

  • 动态规划五步曲:

(1)dp[j]含义: 装满背包容量为j的方式个数。

(2)递推公式: dp[j] += dp[j - nums[i]],装入nums[i]之前,容量为j - nums[i]时的方式个数dp[j - nums[i]],再加上装入nums[i]之后,容量为j时之前的方式个数dp[j],进而得到背包容量为j时,总的方式个数。

(3)dp数组初始化: dp[0] = 1,容量为0时,仅有一种方式可以成立,即选择数字0。

(4)遍历顺序: 先物品、再背包,内层按从大到小遍历的滚动数组。

(5)举例:

输入: nums: [1, 1, 1, 1, 1], S: 3
此时,正数最大为4,里面只有1,因此dp[j]长度为4。
在这里插入图片描述

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {int sumNums = 0;for(int i = 0; i < nums.size(); i++)                    sumNums += nums[i];// target超过总和或者不满足pos为偶数的情况,直接返回0if(abs(target) > sumNums || (sumNums + target) % 2 != 0)     return 0;int dp[10001] = {0};dp[0] = 1;int pos = (sumNums + target) / 2;for(int i = 0; i < nums.size(); i++) {for(int j = pos; j >= nums[i]; j--) {// 组合情况要累计dp[j] += dp[j - nums[i]];}}return dp[pos];}
};

参考文章:494. 目标和、目标和、目标和(详细C++代码动态规划详细思路分析)

http://www.lryc.cn/news/3064.html

相关文章:

  • MySQL-窗口函数
  • 【C++设计模式】学习笔记(1):面向对象设计原则
  • [测开篇]设计测试用例的方法如何正确描述Bug
  • 设计模式学习笔记--单例、建造者、适配器、装饰、外观、组合
  • English Learning - Day5 L1考前复习 2023.2.10 周五
  • C. Prepend and Append
  • javassm超市在线配送管理系统
  • Scratch少儿编程案例-多模式贪吃蛇(无尽和计时)
  • 谷歌蜘蛛池怎么搭建?Google蜘蛛池可以帮助谷歌排名吗?
  • Kubernetes集群-部署Java项目
  • English Learning - Day54 作业打卡 2023.2.8 周三
  • 【Unity题】 1.矩阵旋转,欧拉旋转,四元数旋转各自的优缺点。2.StringBuilder和String的区别
  • 【C++面试问答】搞清楚深拷贝与浅拷贝的区别
  • day10_面向对象基础
  • 电影订票网站的设计与开发
  • seata【SAGA模式】代码实践(细节未必完全符合saga的配置,仅参考)
  • 面试题:Java锁机制
  • Springboot Web开发
  • 分布式事务 | 使用DTM 的Saga 模式
  • 错误代码0xc0000001要怎么解决?如何修复错误
  • 为什么 HTTP PATCH 方法不是幂等的及其延伸
  • 13 Day:实现内核线程
  • GPU服务器安装显卡驱动、CUDA和cuDNN
  • 结构体变量
  • Java 多态
  • 九龙证券|一夜暴跌36%,美股走势分化,标普指数创近2月最差周度表现
  • 【数据库】 mysql用户授权详解
  • 【性能】性能测试理论篇_学习笔记_2023/2/11
  • C语言(输入printf()函数)
  • Zabbix 构建监控告警平台(四)