3個人去打飯,滿足所有可能的需求需要多少個盤子?

現在有3個人去打飯,

食堂的打飯師傅是個非常精確的人,說打一兩飯就絕對是一兩飯。而且他有一個分析天平,可以在大家還沒來打飯之前就稱好飯的重量,並放到不同盤子裡面。

現在問:這個打飯師傅至少需要多少個盤子才能使得無論這3個人分別要多少飯都可以精確地得到滿足?每個人的飯量在一兩到兩斤(二十兩)之間,最小單位是兩。

註:打飯的時候可以combine幾個盤子給一個人。天平只能在一開始的時候使用。


@管清文 的答案早了一步TAT
12個是可以的,方案是1,1,1,2,2,3,4,5,7,9,12,16

我是這樣想的,首先加強條件,要求「三個人都打相同數目的飯n」,再考慮只需要滿足「已有盤子中的飯的總重量超過需要供應的飯的總重量」,這時所需要盤子的數目的下界顯然也是原問題的一個下界。
n=1時,顯然需要1,1,1這3個盤子;
n=2時,共需要分量為2*3=6的飯,而已有盤子中的分量為3,至少再要2個分量&<=2的盤子;
n=3時,共需要分量為3*3=9的飯,而已有盤子中的分量至多為7,至少再要1個分量&<=3的盤子;
n=4時,共需要分量為3*4=12的飯,而已有盤子中的分量至多為10,至少再要1個分量&<=4的盤子;
n=5時,共需要分量為3*5=15的飯,而已有盤子中的分量至多為14,至少再要1個分量&<=5的盤子;
n=6時,共需要分量為3*6=18的飯,而已有盤子中的分量至多為19,此時不需要額外的盤子;
n=7時,共需要分量為3*7=21的飯,而已有盤子中的分量至多為19,至少再要1個分量&<=7的盤子;
n=8時,共需要分量為3*8=24的飯,而已有盤子中的分量至多為26,此時不需要額外的盤子;
n=9時,共需要分量為3*9=27的飯,而已有盤子中的分量至多為26,至少再要1個分量&<=9的盤子;
依此類推,在n=12、16時各再需要一個分量&<=12和&<=16的盤子。
因此,12個盤子是盤子數目的下界,至少需要12個盤子才能滿足「都打相同數目的飯」的情況下對"總重量"的要求(但可能不滿足原問題的要求)。

注意到上述過程中給出了一個12個盤子的組合,就是(1,1,1,2,2,3,4,5,7,9,12,16),經程序驗證(╮(╯_╰)╭,這個組合可以解決原問題(只需要使用貪心的做法,不斷地把當前最大的盤子提供給當前最需要飯的那個人),因此原問題的答案就是12個盤子。

附醜陋的代碼:

num = [16, 12, 9, 7, 5, 4, 3, 2, 2, 1, 1, 1]
n = 20

for i in range(n):
for j in range(n-i):
for k in range(n-i-j):
a = i + 1
b = j + i + 1
c = k + j + i + 1
left = [a,b,c]
for i1 in range(12):
j1 = 0
while j1&<3: if left[j1]&>=num[i1]:
left[j1] = left[j1] - num[i1]
j1 = 3
else:
j1 = j1 + 1
if left != [0,0,0]:
print(a,b,c)
print("end")


如果只有1個人打飯,則需要的盤子有:
1, 2, 4, 8, 16, ...
F(n) = [F(1) + ... + F(n-1)] + 1

如果只有2個人打飯,則需要的盤子有:
1, 1, 2, 3, 4, 6, 9, 14, ..
F(n) = [F(1) + ... + F(n-1)] / 2 + 1

如果只有3個人打飯,則需要的盤子有:
1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 22, ...
F(n) = [F(1) + ... + F(n-1)] / 3 + 1

證明(終於想到怎麼證明了)
對於答案的下界,已經由 @Richard Xu 很好的證明。
對於答案的可行性,證明如下:
我們證明一個更強的結論,用前n個盤子,可以組成a + b + c le sum_{i=1}^n {F_i}, 其中a ge b ge c ge 0,的所有組合。
通過數學歸納法來證明。

1. 當n很小的時候,可以通過枚舉證明。
2. 假設原本問題對於n-1成立,對於n的情況,
2.1 如果a le  (F_n - 1) = lfloor frac{1}{3} sum_{i-1}^{n-1} F_i 
floor
a + b + c le 3a le 3 (F_n - 1) le   sum_{i=1}^{n-1} F_i
可以用前n-1個盤子就組成需要的組合。
2.2 如果a ge F_n,則
(a - F_n) + b + c le sum_{i=1}^{n-1} F_i,只需用前n-1個盤子組成a - F_n, b, c的組合,再把第n個盤子給第一個人即可。


(?Д?≡?д?)!?

看到這個問題以及目前的八個回答的我


管清文 的答案應該是正確的。

更一般地,對於有 m 個人買飯的情況,每個人可以買 1~n 兩,則需要的盤子的數列滿足:

f(k)=1, k=1,2,..m
f(k)=left[ frac{sum_{i=1}^{k-1}{f(i)} }{m}  
ight]+1 , kgeq m+1

需要的盤子數 t 滿足:

t(m,n)=left{ max(k)| f(k)leq n 
ight}


我只能說,作業自己獨立完成。


說句題外話,我想我理解題主你問的目的是什麼,但是如果廚師打飯真的絕對精準,最小單位又是兩的話,那要分析天平幹啥,那樣的話如果人來打飯的時候能從鍋里盛的話三個就夠了吧,如果不能從鍋里盛,食物又不能浪費的話那隻能多來一個盤子裝60兩了。 所以題中能先去掉廚師絕對精準的手這種bug么。


很好奇為什麼會有這種太脫離現實生活實踐的問題出現。為了顯示打飯師傅水平需要準備這麼些盤子,都不知道這個食堂是為了做生意還是為了學數學的人炫技而存在。


四個1兩一個2兩。共5個盤子

三人最少(都一兩),需要至少三個盤子各裝1兩
三人最多(各二兩),在已有三個1兩前提下還需要6-3兩,也就是再增加一個1兩一個2兩
即分配按照11,11,2


數論問題這個是 數學專業的學生立刻就可以做出來吧
首先所有人都只吃一兩的情況存在 即必須有三個一兩的盤子
個人憑感覺的話似乎三等分二十比較好...準備6個7兩的盤子 再準備三組1 2 3兩的盤子 一共15個 雖然標答應該很複雜...


推薦閱讀:

已知f(f(x)),在怎樣的條件下,可求f(x)?
如何證明加法交換律?
在線性代數中A的平方等於A,可以得到什麼信息?
三階魔方,最少多少步可以打亂(直至對於每一面而言,不存在三個相連的色塊)?假如可以,請給出打亂步驟
f(1)=1/2,f(2x)=2f(x),求證f(x)=x/2。?

TAG:數學 | 趣味數學 |