乙個有趣的規劃問題

2021-10-10 16:33:36 字數 1848 閱讀 5451

最近看到了乙個有趣的小問題,整理了一些自己的思考,對此做乙個簡單的總結。

問題如下:

我在某寶買了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次。當然,這個 問題是要求盡可能的用 ...