程式設計之美 遊戲之樂 1 4買書問題(改進解法)

2021-07-24 08:01:41 字數 3410 閱讀 3355

原版解法以及改進解法均給出

改進解法思路展示:

假設輸入為[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本第一冊,那是不會有折扣的 買兩本第一冊,一本第二冊,那其中的有一本第一冊是不能享受折扣的。現在需要你設計乙...