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