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

dp专题10 目标和

本题链接:. - 力扣(LeetCode)

题目:

思路:

        根据这道题,可以通过暴力的方法进行取 + 号或者 - 号 两个操作,通过当刚好得到 target 的时候 答案 +1,但是通过长度是 20 ,操作状态为 2个,随后的回溯暴力递归,最坏的情况时间复杂度大约是 20^20^2 ,肯定会TLE了。

        这时候就用到了动态规划dp,这里我们可以知道有两个操作 +  -,我们分成两个子集,一些放正号子集 left,另一些放负号子集 righ。

最后得到 :  left + righ = sum                 其中 sum 为整个 nums 数组的总和

然后将两个子集合并:   left - righ = target    

根据这两个式子我们可以推导出              left = (sum + target) / 2

这时候我们又可以将其看作为 背包问题了,根据题目意思要求的是能够凑成 target的方法有多少种,相当于背包问题中能够刚好装满给背包容量的方案数是多少一样的。

只是这里需要计算背包容量   v 为  left 

代码详解如下:

inline int findTargetSumWays(vector<int>& nums, int target) 
{int sum = 0;	// 计算 nums 数组的总和for(int &i:nums) sum += i;// 分成两个子集,   一个是正号的子集 left , 一个是 负号的子集 righ// left + righ = sum// left - righ = target// left = (sum + target) / 2// 令 left 作为 背包容量,问刚好凑够 left 的子集有多少种方法// 其中 当 (sum + target) 不能被 2 整除 或者 当全部为 +号 或者 -号 的sum   小于 target,说明根本凑不齐int v = (sum + target) / 2;if(v * 2 != (sum + target) || abs(target) > sum) return 0;// dp[i] 中 i 含义为 : 装满 容量 i        dp[i] 含义为 装满 容量 i 的方法有多少种   int n = nums.size();vector<int>dp(n + 1000,0);/* 递推公式:  dp[i - num[i]] = dp[i] 即: 有  dp[target - num[i]]种方法 凑成 dp[target]  假设 num[i] = i  target = 5即:    1   dp[4] 种方法凑成 dp[5]									2   dp[3] 种方法凑成 dp[5]3   dp[2] 种方法凑成 dp[5]4   dp[1] 种方法凑成 dp[5]5   dp[0] 种方法凑成 dp[5]最后 dp[5] 中方法总共有: dp[0] + dp[1] + dp[2] + dp[3] + dp[4]最后公式为   dp[i] += dp[i - nums[i]]*/// dp 初始化, 0 凑成 0 的方法只有一种dp[0] = 1;for(int i = 0;i < n;++i){for(int j = v;j >= nums[i];--j){dp[j] += dp[j - nums[i]];}}return dp[v];
}

最后提交:

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

相关文章:

  • 详解 docker 镜像制作的两种方式
  • selenium元素单击不稳定解决方法
  • vue3中vite使用sass
  • centos 8.0 安装sysbench 1.0.17
  • LabVIEW开发分布式光纤油气管道泄漏检测及预警系统
  • Go后端开发 -- Go Modules
  • 基于det_keypoint_unite的ROS功能包(jetson部署)
  • TS 36.211 V12.0.0-下行(8)-调制和上变频
  • 基于SSM酒店后台管理系统【源码】【最详细运行文档】
  • 利用Python实现每日新闻早报推送
  • 图像分割-Grabcut法
  • 性能测试浅谈
  • 媒体运营常用的ChatGPT通用提示词模板
  • Java学习苦旅(二十一)——泛型
  • 具备闭环思维的测试才更充分
  • flask web学习之模板(一)
  • RedisInsight - Redis官方可视化工具
  • Matlab定义函数计算斐波那契数列
  • 计算机网络面试题总结
  • 视频转为序列图的软件,让视频批量转为序列图
  • 目标检测中的常见指标
  • QT上位机开发(会员充值软件)
  • 小程序实现绘制图片 保存到手机
  • Elasticsearch基本操作之索引操作
  • 调用Java线程相关的API为什么能够控制操作系统线程?
  • 【办公技巧】excel中设置选项按钮的方法
  • 如何编写高效的正则表达式?
  • vue3中使用pinia,更改state中数据,试图不更新问题
  • 【前端设计】文字聚光灯
  • 从零开始搭建企业级前端项目模板(vue3+vite+ts)