找錢方式公升級版 求隊伍組合

2021-08-01 08:40:16 字數 1096 閱讀 9073

在做遊戲匹配演算法的過程中,我遇到乙個有趣的演算法,可以說是「找錢方式」的公升級版

找錢方式:

題目描述如下:

已知遊戲中一方人數為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...