龙胜做网站的公司,自己创造网站,潍坊哪里有做360网站护栏,vi设计与网站建设招标文件给你一个由 不同 整数组成的数组 nums #xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。
题目数据保证答案符合 32 位整数范围。
示例 1#xff1a;
输入#xff1a;nums [1,2,3], target 4 输出#xff1a;7 解释…给你一个由 不同 整数组成的数组 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 nums.length 200 1 nums[i] 1000 nums 中的所有元素 互不相同 1 target 1000
解题思路
数组含义
枚举1至target的值使用一个一维数组记录可以组成当前元素的组合个数
状态转移方程就是 for _, num : range nums {//枚举nums数组if i-num0dp[i-num]0{dp[i]dp[i-num]}}dp[i-num]大于0说明i-num可以由nums数组中的元素组成并且组合个数为dp[i-num],因此i同样也能由nums数组元素组合而来并且组合个数为dp[i-num]
初始化 for _, num : range nums {if numtarget {continue }dp[num]1}枚举numsdp[num]1即nums数组中元素可以直接组成一个target值而且组合个数为1
代码
func combinationSum4(nums []int, target int) int {dp : make([]int, target1)for _, num : range nums {if numtarget {continue }dp[num]1}for i : 1; i target; i {for _, num : range nums {if i-num0dp[i-num]0{dp[i]dp[i-num]}}}return dp[target]}