原版解法以及改進解法均給出
改進解法思路展示:
假設輸入為[7,6,5,4,3]
通過某個過程達到了[3,3,3,3,3]這種狀態
那麼這時候的結果res+=5*0.25*3即可
不需要繼續執行下去
同理如果出現了[0,3,3,3,3]這種狀態
那麼這時候的結果res+=4*0.2*3即可
不需要繼續執行下去
因此程式存在優化空間
在此我只給出第一種其中下的優化解法
之後的優化同理可以寫出來
#coding=utf-8
#author='hl'
class
solution
():def
solve
(self,nums):
nums = sorted(nums)
res = self.in_put(nums)
return
8*(sum(nums)-res)
defin_put
(self,nums):
#print nums#
''' 用作測試程式呼叫次數
輸入為[7,6,5,4,3]時
該程式呼叫了2萬次左右
'''res = 0
if self.is_equal(nums):
return
5*0.25*nums[0]
if nums[0]>0:
res = max(5*0.25+self.in_put([ nums[i]-1
for i in range(len(nums))]),res)
if nums[1]>0:
res = max(4*0.2+self.in_put(sorted(nums[:1]+[nums[i]-1
for i in range(1,len(nums))])),res)
if nums[2]>0:
res = max(3*0.1+self.in_put(sorted(nums[:2] + [nums[i] - 1
for i in range(2, len(nums))])), res)
if nums[3] > 0:
res = max(2*0.05+self.in_put(sorted(nums[:3] + [nums[i] - 1
for i in range(3, len(nums))])), res)
return res
defis_equal
(self,nums):
for i in range(len(nums)-1):
if nums[i]!=nums[i+1]:
return
false
return
true
zz = solution()
print zz.solve([2,2,2,1,1])
#coding=utf-8
#author='hl'
class
solution
():def
solve
(self,nums):
nums = sorted(nums)
res = self.in_put(nums)
return
8*(sum(nums)-res)
'''假設輸入為[7,6,5,4,3]
通過某個過程達到了[3,3,3,3,3]這種狀態
那麼這時候的結果res+=5*0.25*3即可
不需要繼續執行下去
同理如果出現了[0,3,3,3,3]這種狀態
那麼這時候的結果res+=4*0.2*3即可
不需要繼續執行下去
因此程式存在優化空間
在此我只給出第一種其中下的優化解法
之後的優化同理可以寫出來
'''defin_put
(self,nums):
#print nums#
''' 用作測試程式呼叫次數
輸入為[7,6,5,4,3]時
該程式呼叫了3千次左右
'''res = 0
if self.is_equal(nums):
return
5*0.25*nums[0]
if nums[0]>0:
res = max(5*0.25+self.in_put([ nums[i]-1
for i in range(len(nums))]),res)
if nums[1]>0:
newnums = sorted(nums[:1] + [nums[i] - 1
for i in range(1, len(nums))])
if self.is_equal(newnums):
res = max(4 * 0.2 + 5 * 0.25 * newnums[0], res)
return res
else:
res = max(4 * 0.2 + self.in_put(newnums), res)
if nums[2]>0:
newnums = sorted(nums[:2] + [nums[i] - 1
for i in range(2, len(nums))])
if self.is_equal(newnums):
res = max(3 * 0.1 + 5 * 0.25 * newnums[0], res)
return res
else:
res = max(3 * 0.1 + self.in_put(newnums), res)
if nums[3] > 0:
newnums = sorted(nums[:3] + [nums[i] - 1
for i in range(3, len(nums))])
if self.is_equal(newnums):
res = max(2*0.05 + 5 * 0.25 * newnums[0], res)
return res
else:
res = max(2 * 0.05 + self.in_put(newnums), res)
return res
defis_equal
(self,nums):
for i in range(len(nums)-1):
if nums[i]!=nums[i+1]:
return
false
return
true
zz = solution()
print zz.solve([7,6,5,4,3])
通過改進演算法,其實仍有更為優化的演算法這裡就不一一贅述 買書問題 程式設計之美1 4
買書問題,如果一種書籍五冊,單獨買一冊8元,買兩冊不同的打95折,買三冊不同的書籍9折,買四冊不同的書籍8折,買五冊不同書籍75折,問怎麼買書最便宜。比如買2本一冊,2本2冊,2本三冊,1本4冊,1本5冊 那麼最優打折方式就是 分兩次購買,一本一冊,一本二冊,一本三冊和一本四冊,然後就是剩下的書籍 ...
程式設計之美 1 4 買書問題
1.4 買書問題 在 節假日的時候,書店一般都會做 活動。由於 哈利波特 系列相當暢銷,店長決定通過 活動來回饋讀者。在銷售的 哈利波特 平裝本系列中,一共有五 卷,用編號0,1,2,3,4來表示。假設每一捲單獨銷售均需要8歐元。如果讀者一次購買不同的兩卷,就可以扣除5 的費用,三卷則更多。假設具體...
程式設計之美 1 4 買書問題
題目 在節假日的時候,一般書店都會做 假設一套書共有5冊,沒冊書的定價都是相同的30元,店家為了 推出了乙個方案,具體如下 這裡的折扣是每本書都享受這個折扣,當然前提是購買不同的冊,比如買10本第一冊,那是不會有折扣的 買兩本第一冊,一本第二冊,那其中的有一本第一冊是不能享受折扣的。現在需要你設計乙...