再學動態規劃之 01揹包

2021-08-29 02:27:48 字數 3662 閱讀 8686

寫了之後,發現這題跟01揹包還有點區別。但是寫看這個吧。

暴力搜尋的方法。就是每個取或者不去。

class

solution

(object):

defgets

(self, arr, index, target)

:if target ==0:

return

true

elif target <0:

return

false

else

:if index ==

len(arr)-1

:if arr[index]

== target:

return

true

else

:return

false

else

:return self.gets(arr, index+

1, target)

or self.gets(arr, index+

1, target-arr[index]

)def

canpartition

(self, nums)

:"""

:type nums: list[int]

:rtype: bool

"""total =

sum(nums)

if total%2==

1:return

false

target = total/

2return self.gets(nums,

0, target)

超時是必然的。接下來,我們把目前 考慮index和目標target記錄下來:

rec_dict =

dict()

class

solution

(object):

defgets

(self, arr, index, target)

:if target ==0:

return

true

elif target <0:

return

false

else

:if index ==

len(arr)-1

:if arr[index]

== target:

return

true

else

:return

false

else

: temp =

str(index)

+'_'

+str

(target)

if temp in rec_dict:

return rec_dict[

str(index)

+'_'

+str

(target)

]else

: rec_dict[

str(index)

+'_'

+str

(target)

]= self.gets(arr, index+

1, target)

or self.gets(arr, index+

1, target-arr[index]

)return rec_dict[

str(index)

+'_'

+str

(target)

]def

canpartition

(self, nums)

:"""

:type nums: list[int]

:rtype: bool

"""rec_dict.clear(

) total =

sum(nums)

if total%2==

1:return

false

target = total/

2return self.gets(nums,

0, target)

這下通過了。但是我們發現這裡 存在眾多的遞迴呼叫。這就是因為沒有按順序計算的結果。這也引入了動態規劃:

class

solution

(object):

defcanpartition

(self,nums)

:"""

:type nums: list[int]

:rtype: bool

"""total =

sum(nums)

if total %2==

1:return

false

target = total /

2 arr =[[

false

for _ in

range

(target+1)

]for _ in

range

(len

(nums)+1

)]for ix in

range

(len

(arr)):

arr[ix][0

]=true

for i in

range(1

,len

(nums)+1

):for j in

range(1

, target +1)

:if j - nums[i -1]

>=0:

arr[i]

[j]=

(arr[i -1]

[j - nums[i -1]

]or arr[i -1]

[j])

else

: arr[i]

[j]= arr[i -1]

[j]if arr[i]

[target]

==true

:return

true

return

false

之前用

arr =[[

false

]*x]

*y

的方式初始化。看似很厲害,其實是錯的。 詳見:

接下來是有趣的解法

class

solution

(object):

defcanpartition

(self,nums)

:"""

:type nums: list[int]

:rtype: bool

"""possible_sum =

for num in nums:

possible_sum.update(

)return

sum(nums)/2

.in possible_sum

意思就是 直接把可能的和加出來。。。。

高階:bitset!

python沒有對應的寫法,很讓人捉急

動態規劃之01揹包

動態規劃的基本思想 將乙個問題分解為子問題遞迴求解,且將中間結果儲存以避免重複計算。通常用來求最優解,且最優解的區域性也是最優的。求解過程產生多個決策序列,下一步總是依賴上一步的結果,自底向上的求解。動態規劃演算法可分解成從先到後的4個步驟 1.描述乙個最優解的結構,尋找子問題,對問題進行劃分。2....

動態規劃之01揹包

01揹包問題,是用來介紹動態規劃演算法最經典的例子,網上關於01揹包問題的講解也很多,我寫這篇文章力爭做到用最簡單的方式,最少的公式把01揹包問題講解透徹。f i,j 表示在前i件物品中選擇若干件放在承重為 j 的揹包中,可以取得的最大價值。pi表示第i件物品的價值。決策 為了揹包中物品總價值最大化...

動態規劃之01揹包

題目描述 版權說明 本題為改編題。問題描述 發鳩之山,其上多柘木。有鳥焉,其狀如烏,文首,白喙,赤足,名曰精衛,其名自詨。是炎帝之少女,名曰女娃。女娃遊於東海,溺而不返,故為精衛。常銜西山之木石,以堙於東海。山海經 精衛終於快把東海填平了!只剩下了最後的一小片區域了。同時,西山上的木石也已經不多了。...