最近看到了乙個有趣的小問題,整理了一些自己的思考,對此做乙個簡單的總結。
問題如下:
我在某寶買了100袋樂事大波浪薯片,薯片到了菜鳥驛站,菜鳥驛站距離我家500公尺,我要把薯片全部拿回家。但是,我每次最多只能拿50袋,並且我嘴饞,只要手上有薯片,每走10公尺就要吃掉一袋。請問,我最多能把幾袋薯片拿回家?
假設:1.我中途可以把薯片放在地上,不會被人拿走
2.我可以一次取一部分的快遞
3.在對問題的理解中,可以認為走路與吃薯片是同時發生的,我一邊走路一邊吃薯片。這個過程是連續的(比方說我走了3.3333公尺吃了三分之一包薯片)。但是,為簡化模型,在實際建模過程中可以考慮離散情況,即:我每次至少走10公尺,一包薯片必須吃完。我從出發點開始,每走十公尺吃掉一包薯片。
4.我只能乙個人搬薯片,不能借助其餘外力
5.我作為乙個人不會累,在手上沒有薯片時可以不停來回而沒有損耗
思路:最後剩下的薯片最多》吃掉的薯片最少》帶著薯片走的路程最少》每次帶最多的薯片走
策略:1.每次攜帶能攜帶的最多的薯片前進乙個單位(10公尺)
2.如果除了手中的薯片還有其餘薯片在後面,則回頭補充薯片,每次補充能攜帶的最多的薯片
3.如果除了手中薯片,沒有其餘薯片,則一直前進
我們可以將這個策略用python**實現
def method(x, u, l, m):
x0 = 0
l0 = m
l1 = 0
c = 0
while true:
# 如果第一步時能搬的東西大於負重,則按最大負重搬運前進一步,之後補充物資
if l1 == 0 and l0 >= l:
l1 = l0 - l
l0 = l - 1
x0 = x0 + u
c = c + 1
else:
# 如果發現剩下的物資大於最大負重,再次按最大負重搬運物資
if l1 >= l:
l0 = l0 + l - 1
l1 = l1 - l
c = c + 1
else:
if 0 < l1 < l:
# 如果剩下物資不足最大負重,則全部搬過來
l0 = l0 + l1 - 1
l1 = 0
c = c + 1
else:
# 如果沒有剩餘,則一直往前走
x0 = x0 + u
l0 = l0 - 1
c = c + 1
if x0 == x and l1 == 0 :
break
return c, l0
def myanswear():
x = int(input('路程'))
u = int(input('每單位消耗所走里程'))
l = int(input('最大負重'))
m = int(input('總量'))
a, b = method(x, u, l, m)
print('路途中的損耗是:')
print(a)
print('最終剩下:')
print(b)
myanswear()
顯而易見,上述**針對離散的情形(取整數的路程、最大負載、總貨物量、消耗等均取整數)具有一定的泛化能力。
按照題意,輸入引數 x=500,u=10,l=50,m=100,即可得到結果。
這個策略下,最終最小損失為75 ,能帶回家25包薯片。
經過分析可以發現,在題目給定引數條件下,最優化演算法結果與方法2相同。
方法2:
先搬50袋薯片到半路停下(手中剩25袋薯片)
回頭再搬50袋薯片到半路
一次搬50袋薯片到終點
乙個有趣的問題
今早朋友圈某人以100軟妹幣求助這樣乙個問題 概率論是學的一塌糊塗,但是突然想起類似用蒙特卡洛方法可以模擬出來概率。於是向著這100軟妹幣出發了。但是首先遇到了第乙個問題。陣列b的亂序排列感覺有點棘手。首先的第一反應是 迴圈隨機產生1 100的隨機數,判斷陣列中是否已經有該數,若已存在,則重新生成隨...
乙個有趣的指標問題
是從網上看到的乙個例子 struct s int i int p void main struct s s int p s.i p 0 4 p 1 3 s.p p s.p 1 1 s.p 0 2 問程式會在哪一行死掉 解答 程式執行到最後一行就會報出異常,死掉.具體解答為 首先需要說明的是結構體s,...
乙個有趣的SQL問題。
有朋友近來要我幫忙解決乙個 問題,問題描述 有表,表有3個字段 f1,f2,f3,其中,每個欄位中都可能出現1 9之間的9個數字,現要統計出整個表中1 9各出現的次數。如 f1 f2f311 2123 212在上例中 1 出現了4次,2 出現了4次,3 出現了1次。當然,這個 問題是要求盡可能的用 ...