這道題目是在陣列中找到和為給定目標正整數的組合的個數,題目如下所示:
這道題目就難在不限陣列中元素使用的個數,我們如果用窮舉的方法很難得到正確的答案。於是我們可以想到用動態規劃的思想來解決這個問題。
首先我們求的是和,我們就可以把和進行拆分,如題目中的例子為例,num
s=[1
,2,3
]nums = [1,2,3]
nums=[
1,2,
3];t ar
get=
4target=4
target
=4,那麼我們就可以把 dp[
n]dp[n]
dp[n
] 定義成和為 n
nn 的時候,有多少種不同的組合,那麼和為4的時候就可以把和進行拆分,可以拆分成 num
s[0]
+3nums[0]+3
nums[0
]+3、num
s[1]
+2nums[1]+2
nums[1
]+2、num
s[2]
+1nums[2]+1
nums[2
]+1,所以 dp[
4]=d
p[ta
rget
−num
s[0]
]+dp
[tar
get−
nums
[1]]
+dp[
targ
et−n
ums[
2]]=
dp[1
]+dp
[2]+
dp[3
]dp[4]=dp[target-nums[0]]+dp[target-nums[1]]+dp[target-nums[2]]=dp[1]+dp[2]+dp[3]
dp[4]=
dp[t
arge
t−nu
ms[0
]]+d
p[ta
rget
−num
s[1]
]+dp
[tar
get−
nums
[2]]
=dp[
1]+d
p[2]
+dp[
3]所以我們可以得到此題的解題**:
class solution(object):
def combinationsum4(self, nums, target):
""":type nums: list[int]
:type target: int
:rtype: int
"""nums.sort()
dp = [0 for i in range(target+1)]
dp[0] = 1
for i in range(target+1):
for val in nums:
assert val > 0
if val > i:
break
dp[i] += dp[i-val]
return dp[-1]
細緻分析之後我們會發現此題的遞推方程dp[
targ
et]=
dp[t
arge
t−nu
ms[0
]]+d
p[ta
rget
−num
s[1]
]+..
.+dp
[tar
get−
nums
[len
(num
s)−1
]]dp[target]=dp[target-nums[0]]+dp[target-nums[1]]+...+dp[target-nums[len(nums)-1]]
dp[tar
get]
=dp[
targ
et−n
ums[
0]]+
dp[t
arge
t−nu
ms[1
]]+.
..+d
p[ta
rget
−num
s[le
n(nu
ms)−
1]]所以我們可以通過動態規劃的方法來解決此類需求很模糊的題目,但是要理解其中的思想。希望這篇博文能夠幫助大家更好地理解動態規劃的思想,謝謝。
leetcode 377 組合總和
給定乙個由正整數組成且不存在重複數字的陣列,找出和為給定目標正整數的組合的個數。示例 nums 1,2,3 target 4 所有可能的組合為 1,1,1,1 1,1,2 1,2,1 1,3 2,1,1 2,2 3,1 請注意,順序不同的序列被視作不同的組合。因此輸出為 7。不像組合總和 組合總和 ...
LeetCode 377 組合總和
給定乙個由正整數組成且不存在重複數字的陣列,找出和為給定目標正整數的組合的個數。nums 1,2,3 target 4 所有可能的組合為 1,1,1,1 1,1,2 1,2,1 1,3 2,1,1 2,2 3,1 請注意,順序不同的序列被視作不同的組合。因此輸出為 7。class solution ...
leetcode377 組合總和4
給定乙個由正整數組成且不存在重複數字的陣列,找出和為給定目標正整數的組合的個數。示例 nums 1 2,3 target 4所有可能的組合為 1 1,1 1 1,1,2 1 2,1 1,3 2 1,1 2,2 3 1 請注意,順序不同的序列被視作不同的組合。因此輸出為 7。方法一 遞迴 超時 cla...