当前位置:网站首页>代码随想录笔记_动态规划_377组合总和IV
代码随想录笔记_动态规划_377组合总和IV
2022-08-09 14:43:00 【Erik_Won】
代码随想录笔记_动态规划
代码随想录二刷笔记记录
LC377.组合总和IV
题目
完全背包
给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。
题目数据保证答案符合 32 位整数范围。
示例 1:
输入:nums = [1,2,3], target = 4
输出:7
解释:
所有可能的组合为:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
请注意,顺序不同的序列被视作不同的组合。
示例 2:
输入:nums = [9], target = 3
输出:0
思路分析
分析:由题中示例1可知,本题所求为排列个数
回顾 LC 518
组合不强调元素间的顺序,排列强调元素间的顺序
因为本题只求排列个数,而不是返回所有排列,因此,采用 dp 而不用采用回溯。
动态规划五部曲
1.确定dp数组及其下标的含义
dp[j] :组成目标正整数 j 的排列个数为 dp[j]
目标正整数即为背包容量 j,也可以理解为
表示由背包容量j,放置nums中的元素,组成所有可能的排列 dp[j]
2.确定递推公式
由494.目标和,可知求组合的递推公式
dp[j] += dp[j - nums[i]]
所有的 dp[j - nums[i]] 累加,就是 nums[i] 所有可能的组合数量
3.初始化
背包组合问题,dp[0]初始化为1即可,避免累加为0的情况出现
4.遍历顺序
注意,示例1所求的组合包含了(1,1,2),(1,2,1) ,说明题目要求的是排列(顺序不同则算作一种新的组合)。
回顾518可知,排列需要先遍历背包,后遍历物品。
for(int j = 0;j <= target;j++){
//遍历背包容量j
for(int i = 0;i < nums.length;i++){
//遍历物品i
//物品超过背包容量,则不需要添加
if(j >= nums[i]){
dp[j] += dp[j - nums[i]];
}
}
}
5.推演分析
以nums[1,2,3] , target = 4 为例
背包j/物品i | init | 物品0 | 物品1 | 物品2 |
---|---|---|---|---|
0 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 1 | 1 |
2 | 0 | 1 | 2 | 2 |
3 | 0 | 1 | 3 | 4 |
4 | 0 | 1 | 5 | 7 |
代码实现
完整代码实现
public static int combinationSum4(int[] nums, int target) {
//初始化
int[] dp = new int[target+1];
dp[0] = 1;
//遍历
for(int j = 0;j <= target;j++){
//先遍历背包
for(int i = 0;i < nums.length;i++){
//遍历物品
if(j >= nums[i]){
dp[j] += dp[j - nums[i]];
System.out.print(dp[j] + " ");
}
}
System.out.println();
}
return dp[target];
}
边栏推荐
猜你喜欢
一款翻译机背后的全球经济浪潮
Computer Graphics From Scratch - Chapter 5
刷完这174道Android开发面试题,搞懂所有技术栈
SMI 与 Gateway API 的 GAMMA 倡议意味着什么?
听书项目总结
升级适配AGP 7.0
*5-1 CCF 2015-03-1 Image rotation
spacedesk-notebook, tablet, extended screen-solve the problem that the tablet font is too small
数据建模已死,真的吗?
Meta released 175 billion chatbots, and billionaire boss Xiao Zha was madly complained by "him"!
随机推荐
Computational Imaging Technology
太厉害了!华为大牛终于把MySQL讲的明明白白(基础+优化+架构)
C语言程序设计笔记(浙大翁恺版) 第七章:函数
【Serilog】具有完全结构化事件的简单.NET日志记录
golang中的select原理解析
leetcode_jz
YOLOv5网络详解
机器学习--数学库--概率统计
shell提取ip地址
VMWare does not use easy install, install ISO manual manually
下班后用微信工作发病是否属于工伤?法院这样判
resNet_model—定义残差网络模型
SQL Server查询优化
Fiddler弱网测试
[LeetCode] 485.最大连续 1 的个数
spacedesk-notebook, tablet, extended screen-solve the problem that the tablet font is too small
JS 选项卡切换tab
C语言程序设计笔记(浙大翁恺版) 第十一周:结构类型
Assembly language learning (4)
拒绝“重复造轮子”,百度EasyDL让你玩转AI定制开发