在做遊戲匹配演算法的過程中,我遇到乙個有趣的演算法,可以說是「找錢方式」的公升級版
找錢方式:
題目描述如下:
已知遊戲中一方人數為x個人,組隊上限為y人,求滿足x的所有隊伍組合。
比如 x = 3, y = 2
結果應該為[, ]。就是1個人的隊伍3個,或者1個人的隊伍1個&2個人的隊伍1個;這兩種組合可以得到3個人。
抽象:
com(x) = sigma(f(i, x)) 1<=i<=min(x,y),求com(x)。
f(i,j):最大人數為i人的隊伍,和為j個人。類似於和為m,最大面值為c的找錢方式。
f(i,j) = sigma(f(i-1, j-ki)每一項後面都加上) 0<=k<=floor(j/i)
= f(i-1, j) + f(i, j-i)每一項後面都加上
f(1,1) = [,]
f(i,j) = f(j, j) (i > j)
如果把i省略,那麼定義h(j):和為j個人的所有組合,和com(x)的定義一致。求h(x)。
先初始化邊界條件:h(0)=[{},]
得到以下**:
def get_combination(x, y):
from collections import defaultdict
import copy
h = defaultdict(list) # h(j) : sum of list equals j
# init for case i = 0
h[0] = [{}, ]
for i in xrange(1, y + 1):
for j in xrange(1, x + 1):
if i > j:
continue
pre = h[j - i]
for item in pre:
item_copy = copy.deepcopy(item)
if i in item_copy:
item_copy[i] += 1
else:
item_copy[i] = 1
return h[x]
介面公升級版
介面公升級版 假設乙個介面由2w個子類實現它 假如在介面內加乙個方法 那麼按照定義就要在這所有的子類裡面都實現 所以我們引入新概念 介面裡可以定義普通方法 即這個普通方法可以不被實現 普通方法就要用default實現 介面還可以實現static方法 呼叫是直接由介面.方法名呼叫 inte ce im...
採藥公升級版
問題描述 辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他 想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫 師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個山洞裡有一些不同 的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時 間,在這...
約瑟夫問題公升級版
編號為1 n的n個人按順時針方向圍坐一圈,每人持有乙個密碼 正整數,可以自由輸入 開始人選乙個正整數作為報數上限值m,從第乙個人按順時針方向自1開始順序報數,報道m時停止報數。報m的人出列,將他的密碼作為新的m值,從他順時針方向上的下乙個人開始從1報數,如此下去,直至所有人全部出列為止。includ...