1題目:給乙個陣列和乙個數,從這個陣列找出幾個數的和是這個數。
比如 9,如果可以找到比如4+5=9,則返回true
動態規劃分析:
arr =
下標i:0 1 2 3 4 5
這裡我們設定函式subset(i, s), 我們輸入i 是下標,s是要組合的數。
開始當i 是5時,表示為subset(arr[5],9),後面的s減去選擇的數。
當選擇下標為5的這個 2時,subset(arr[5],7),不選擇2時,subset(arr[4],6)
然後就可以遞迴了,現在來找出口
第乙個出口:當在某個i上已經得出和為s的了,就可以停止,即表示為subset(arr[i],0) 時。
if s ==0:
return
true
第二個出口:當(arr[0],3) ,當i= 0,s還有值, 剛好最後乙個數能組合成這個數才能返回true
否則就是false.
if i ==0:
return arr[0]
== s
第三個出口:
當出現arr[i]比s大,就只能走不選的那條路。比如 arr[2]是12,s是9,只能選擇不選arr[2]。
if arr[i]
> s:
return subset(arr, i-
1, s)
可以得出結論:
一開始是subset(arr,i ,s)
然後選是subset(arr,i -1,s-arr[i])
or 不選是subset(arr,i -1,s-arr[i])
**實現:
arr =[3
,34,4
,12,5
,2]def
rec_subset
(arr, i, s)
:if s ==0:
return
true
elif i ==0:
return arr[0]
== s
elif arr[i]
> s:
return rec_subset(arr, i-
1, s)
else
: a = rec_subset(arr, i-
1, s-arr[i]
) b = rec_subset(arr, i-
1, s)
return a or b
print
(rec_subset(arr,5,
9))print
(rec_subset(arr,5,
10))print
(rec_subset(arr,5,
11))print
(rec_subset(arr,5,
12))print
(rec_subset(arr,5,
13))
結果是 13拼不出來,其他歐克,
true
true
true
true
false
上面使用遞迴,時間複雜度比較高。
使用陣列來完成優化。需要安裝numpy,我沒安裝,暫時就不寫了。。。
動態規劃的案例python(1)
一組數中不能相鄰的幾個數選出來組成的和最大 比如 4,1,1,9,1 我們可以選擇 4,1,1 1,9 4,9 但是只有 4,9 比較大 例如 標號i 0 1 2 3 4 5 6 arr 1 2 4 1 7 8 3 設opt i 為最佳選法。我們倒著看,開始是opt 6 如果選6號位的3,arr 1...
動態規劃經典案例
程式設計師 面試指南 it名企演算法與資料結構題目最優解 左程雲 有n級台階,乙個人每次上一級或者兩級,問有多少種走完n級台階的方法,當n為1時,f n 1,n為2時,f n 2,就是說當台階只有一級的時候,方法數是一種,台階有兩級的時候,方法數為2。那麼當我們要走上n級台階,必然是從n 1級台階邁...
python2之字元編碼案例分析(1)
1.先看 coding utf 8 當你不指定編碼格式,系統預設編碼是ascii,意味著如果你的py檔案中有中文,那麼執行會報錯 defa local print type local print hahaha哈哈哈 local if name main print sys.getdefaulten...