给定 n 个数字和 k 个槽。这样对于每个插槽,它可以是 0 或小于前一个数字的数字,Combinatorics
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
如果我理解正确,这个问题对应
What is the number of combinations to pick up to k elements from a set of n distinct numbers
因为您可以通过从有序集合 [n, n-1, n-2 ... 1] 中划掉除 k 或更少 之外的所有组合来获得所有合法组合,并且然后用零填充所有剩余的插槽。
一组 n 中的 k 个或更少对象的数量是
( n! / n! ) + ( n! / (n-1)! ) + ... + ( n! / (n-k)! )
= sum_(i=0)^k (n!)/((n - i)!)
我目前无法说出明确的公式。稍后我可能会回来尝试解决它,但欢迎任何比我更擅长解决求和问题的人这样做。
免责声明:我从来没有用英语做过数学,所以如果我的某些词汇有问题,请原谅
我有编码问题。给定 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
如果我理解正确,这个问题对应
What is the number of combinations to pick up to k elements from a set of n distinct numbers
因为您可以通过从有序集合 [n, n-1, n-2 ... 1] 中划掉除 k 或更少 之外的所有组合来获得所有合法组合,并且然后用零填充所有剩余的插槽。
一组 n 中的 k 个或更少对象的数量是
( n! / n! ) + ( n! / (n-1)! ) + ... + ( n! / (n-k)! )
= sum_(i=0)^k (n!)/((n - i)!)
我目前无法说出明确的公式。稍后我可能会回来尝试解决它,但欢迎任何比我更擅长解决求和问题的人这样做。
免责声明:我从来没有用英语做过数学,所以如果我的某些词汇有问题,请原谅