根據在演算法-動態規劃2裡提到的思路,讓我們來解決乙個組合問題 :leetcode 第77題。
給定2個整數n,k,求出從[1,…,n]中取k個數字的所有組合。
例如 n=4, k=2
就是從[1,2,3,4]中取2個數字的所有組合。
結果為:[[1, 2], [1, 3], [2, 3], [1, 4], [2, 4], [3, 4]]
(1)假設組合中不包含 第n個數字,原問題就變為:
求出從[1,…,n-1] 中取k個數字的所有組合。
(2)假設組合中包含 第n個數字,原問題就變成了:
求出從[1,…,n-1]中取 k-1 個數字的組合,然後中每個組合中,把第n個數字加進去。
(1)+ (2)就是問題的解。
import copy
class
solution
:def
combine
(self, n, k)
:return self.combine_core(n, k)
defcombine_core
(self, n, k)
:if n <=
0or k <=0:
return
list()
if k ==1:
return
[[i]
for i in
range(1
, n +1)
]# 第(1)種情況
res1 = self.combine_core(n -
1, k)
# 第(2)種情況
res2 = self.combine_core(n -
1, k -1)
# 把 第n個數字 加入(2)的結果中
for l in res2:
# (1)+(2)
res =
list()
if res1:
res.extend(res1)
if res2:
res.extend(res2)
return res
# main
s = solution(
)print
(s.combine(4,
2))
import copy
class
solution
:def
__init__
(self)
: self.memo =
list()
defcombine
(self, n, k)
: self.memo =[[
none
for j in
range
(k+1)]
for i in
range(0
, n+1)
]return self.combine_core(n, k)
defcombine_core
(self, n, k)
:if n <=
0or k <=0:
return
list()
if k ==1:
return
[[i]
for i in
range(1
, n +1)
]# 返回儲存的結果
if self.memo[n]
[k]is
notnone
:return self.memo[n]
[k] res1 = self.combine_core(n -
1, k)
res2 = self.combine_core(n -
1, k -1)
for l in res2:
res =
list()
if res1:
res.extend(res1)
if res2:
res.extend(res2)
# 儲存結果,因為python的list賦值是物件引用的賦值,這裡需要用深拷貝
self.memo[n]
[k]= copy.deepcopy(res)
return res
def
combine
(n, k)
: memo =[[
list()
for j in
range
(k +1)
]for i in
range(0
, n +1)
]for i in
range(1
, n+1)
: memo[i][1
]=[[v]
for v in
range(1
, i +1)
]for i in
range(1
, n+1)
:for j in
range(1
, k+1)
: res1 = memo[i -1]
[j] res2 = memo[i -1]
[j -1]
for l in res2:
ifnot memo[i]
[j]:
memo[i]
[j].extend(copy.deepcopy(res1)
) memo[i]
[j].extend(copy.deepcopy(res2)
)return memo[n]
[k]# main
print
(combine(4,
2))
注意:
這個動態規劃的解法,因為涉及到list的深拷貝,所以會比較耗時。在leetcode上當跑到(20,16)時,會因為耗時太長而通不過的。在前面提到的慕課網的課程裡,是通過回溯法來解決的。我在這裡,是借這個例子來實踐前面學習到的動態規劃的解題思路。
動態規劃(3)
robberies include include include includeusing namespace std 這題是參考的 自己的能力還是不可以。不過做了這題,再和0 1揹包問題想一想,覺得收穫還是不錯。說將逃跑率當成物品價值 小弟還是要繼續消化這條題的思想。double f 10020...
3動態規劃
此次專題主要講解動態規劃,題目大致分為兩類 一種是遞迴來解決,一種是0 1揹包問題。動態規劃就是把乙個問題分成多個階段來解決,並且每個階段都相互有所聯絡。其遵循最優性原理。1,不論初始狀態和第一步決策是什麼,餘下的決策相對於前一次決策所產生的新狀態,構成乙個最優決策序列。2,最優決策序列的子串行,一...
動態規劃 3
尼克每天上班之前都連線上英特網,接收他的上司發來的郵件,這些郵件包含了尼克主管的部門當天要完成的全部任務,每個任務由乙個開始時刻與乙個持續時間構成。尼克的乙個工作日為n分鐘,從第一分鐘開始到第n分鐘結束。當尼克到達單位後他就開始幹活。如果在同一時刻有多個任務需要完成,尼克可以任選其中的乙個來做,而其...