LeetCode 377 組合總和

2021-09-26 02:57:06 字數 2353 閱讀 7326

這道題目是在陣列中找到和為給定目標正整數的組合的個數,題目如下所示:

這道題目就難在不限陣列中元素使用的個數,我們如果用窮舉的方法很難得到正確的答案。於是我們可以想到用動態規劃的思想來解決這個問題。

首先我們求的是和,我們就可以把和進行拆分,如題目中的例子為例,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...