[英]Given n numbers and k slots. Such that for each slot it can be either 0, or a number less than the previous number, Combinatorics
我有編碼問題。 給定 n 個數字和 k 個插槽。 這樣對於每個插槽,它可以是 0,也可以是小於前一個數字的數字。 例如
對於 n=4,k=4
0000, 3000, 3200, 3210 etc.
對於 n=7,k=3
000, 700, 541, 731, 540 etc.
誰能告訴我這里的模式是什么,換句話說,描述可能性數量的公式是什么?
一些說明問題的python代碼(代碼本身並不重要,我正在尋找make_encod(n,k)的封閉形式)
from math import factorial
import math
def make_encod(n,k):
tol=[""]
for i in range(0,k):
tol=make_strin_from_tile(0,max(n-i,1),tol)
print(len(tol))
print(tol)
def make_strin_from_tile(f,t,all):
a=[]
for b in all:
for i in range(f,t):
if len(b)==0 or int(b[-1])>i or int(b[-1])==0==i:
a.append(f"{b}{i}")
return a
#just some examples
print(make_encod(3,1))
print(make_encod(3,2))
print(make_encod(3,3))
print(make_encod(5,4))
會輸出:
> 3
['0', '1', '2']
None
4
['00', '10', '20', '21']
None
4
['000', '100', '200', '210']
None
16
['0000', '1000', '2000', '2100', '3000', '3100', '3200', '3210', '4000', '4100', '4200', '4210', '4300', '4310', '4320', '4321']
None
我正在尋找一個公式來告訴我 make_encod(n,k)) 的答案? 必須有一些更聰明的東西然后實際經歷這個
您可以在此處使用遞歸函數。
def recur(lst,ln,curr='a'):
if ln==len(curr[1:]):
print(curr[1:])
return
else:
for i in lst:
if curr[-1]>i or i=='0':
recur(lst,ln,curr+i)
為什么我使用'a'
作為初始curr
是因為all('a'>str(i) for i in range(10))= True
。
a=[str(i) for i in range(3)] #['0','1','2']
recur(a,1)
#0 1 2
recur(a,2)
00 10 20 21
recur(a,3)
000 100 200 210
b=[str(i) for i in range(5)] #['0','1','2','3','4']
recur(b,4)
0000 1000 2000 2100 3000 3100 3200 3210 4000 4100 4200 4210 4300 4310 4320 4321
如果我正確理解條件,則此問題映射到
從一組n 個不同的數字中選取k 個元素的組合數是多少
因為您可以通過從有序集合 [ n, n-1, n-2 ... 1] 中刪除除k 或更少之外的所有內容來獲得所有合法組合,然后用零填充任何剩余的插槽。
一組 n 中 k 或更少的對象的數量是
( n! / n! ) + ( n! / (n-1)! ) + ... + ( n! / (n-k)! )
= sum_(i=0)^k (n!)/((n - i)!)
我目前無法說出明確的公式。 稍后我可能會回來嘗試解決它,但歡迎任何比我更擅長求和的人這樣做。
免責聲明:我從來沒有用英語做過數學,所以如果我的一些詞匯量不足,請原諒我
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.