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

力扣题解(组合总和IV)

377. 组合总和 Ⅳ

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。

题目数据保证答案符合 32 位整数范围。

思路:

本题实质上是给一些数字,让他们在满足和是target的情况下随机排列组合,然后返回所有的排列数目。注意,本题和完全背包问题有所不同,完全背包问题不要求有先后顺序的区别,比如先放第i个物品再放第一个物品和先放第一个物品再放第二个物品没有区别,但是本题例如1+3=4和3+1=4就是不一样,因此dp数组的含义,具体做法有所不同。

dp[i]表示和是i的所有组合数目。dp[i]+=dp[i-nums[i]]。(对于可以视为在和是i-nums[i]的所有排列方法后面加一个nums[i],注意我的说法,是在所有组合的后面,是后面而不是任意位置,这一点接下来会用到!)

对于循环,本题外层循环是i从0到target,内层循环是对nums数组的遍历。本题外层循环个人理解方式是规定目前最后进入的元素该是那个,然后内存循环表示要进nums[i],这样就可以实现每次遍历都在对应的上一个外层循环排序后加一个元素,保证了没有重复。这里不太好说明,就比如假如有数字1,2,3,第一次会有三个式子1=1,2=2,3=3.然后第二次大循环会有1+1=2,1+2=3,1+3=4,2+1=3,2+2=4,2+3=5,3+1=4,3+2=5,3+3=6,可以很明显看出除了最后一个元素外的前面那一串式子就是上一次外层循环得到的所有式子。(即1,2,3)

初始化:

dp[0]=1,因为一个元素都没有才能使得和为0,只有一种组合。

注意:本题所有排列组合数目可能会非常大,因此通过模运算来保证不会超出int存储范围。

class Solution {
public:int combinationSum4(vector<int>& nums, int target) {const int mod=1e10;int n=nums.size();vector<long long>dp(target+1,0);dp[0]=1;for(int j=0;j<=target;j++){for(int i=0;i<n;i++){  if(j-nums[i]>=0)dp[j]+=dp[j-nums[i]];dp[j]%=mod;}}return dp[target];}
};

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

相关文章:

  • Postgresql主键自增的方法
  • 【源码阅读】Sony的go breaker熔断器源码探究
  • LeetCode题(66,69,35,88)--《c++》
  • 来参与“向日葵杯”全国教育仿真技术大赛~
  • SQL每日一题:删除重复电子邮箱
  • 3、宠物商店智能合约实战(truffle智能合约项目实战)
  • 数据库系列
  • 极狐GitLab如何启用和配置PlantUML?
  • Shell 构建flutter + Android 生成Apk
  • 如何用手机压缩视频?手机压缩视频方法来了
  • Linux下如何安装配置Elastic Stack日志收集系统
  • 【深入C++】map和set的使用
  • 跟代码执行流程,读Megatron源码(二)训练入口pretrain_gpt.py
  • MATLAB练习题——矩阵(2)
  • arm、AArch64、x86、amd64、x86_64 的区别
  • 【SpringBoot】 jasypt配置文件密码加解密
  • 复杂网络的任意子节点的网络最短距离
  • (Qt) 文件读写基础
  • 全产业布局对穿戴甲品牌连锁店的意义
  • git的一些使用技巧(git fetch 和 git pull的区别,git merge 和 git rebase的区别)
  • 展厅中控系统有哪些优势呢
  • FPGA开发在verilog中关于阻塞和非阻塞赋值的区别
  • 动态特征转换的艺术:在Mojo模型中实现自定义变换的策略
  • 如何让Python爬虫在遇到异常时继续运行
  • 手把手带你搭建Snort入侵检测系统
  • 小程序内嵌uniapp页面跳转回小程序指定页面方式
  • 基于 Three.js 的 3D 模型加载优化
  • Jlink下载与适配keil ccs theia教程 用jlink代替ti自己的下载仿真器
  • C# 进制之间的转换(二进制,八进制,十进制,十六进制)
  • Linux 基础开发工具 : Vim编辑器