#m个数,第一次抽取n1个,剩余中第二次抽n2个,依此第n次剩余中抽取nn个,则所有组合的排列值

#m个数,第一次抽取n1个,剩余中第二次抽n2个,依此第n次剩余中抽取nn个,则所有组合的排

#combine()函数借鉴于“窗边的扁豆”

i=0#全局变量,用于指向存放位置
outdata=[[]for i in range(61)]#全局变量,存放所有的排列结果
data=[1,2,3,4,5,6]#测试用数据,带抽取的m
temp=[[]for i in range(len(target_num))]#存储当前环节抽取的结果
step=0
select_data=[]#抽取值
target_num=[1,2,3]#每个环节抽取的数量
target=0#初始化当前环节,用于标记当前的环节
combine(data,step,select_data,target_num,target)

def combine(data,step,select_data,target_num,target):
    global i
    global outdata
    global temp
    if len(select_data)==target_num[target]:#选择的元素已经够了,就输出并且返回
        temp[target]=select_data                   #临时存储当前环节抽取值
        if target==len(target_num)-1:#如果抽取环节为最后环节,则输出各个抽取环节的抽取值
            for lt in range(len(target_num)):#将各个环节抽取值拼接后放入输出结果outdata的全局变量中的第i组中
                outdata[i].extend(temp[lt])
            i=i+1#将全局变量i加1,使得输出抽取结果指向下一组
            return        
        combine(list(set(data)-set(select_data)),0,[],target_num,target+1)#未抽取到最后环节,则运行下一环节抽取
        return 
    if step >=len(data):#没有元素选了而且还没够,也是直接返回
        return
    select_data.append(data[step])#选择当前元素
    combine(data,step+1,select_data,target_num,target)
    select_data.pop()#别忘了从已选元素中剔除
    combine(data,step+1,select_data,target_num,target)#不选择当前元素

 

def combinecount(m,n):#m个数中抽取n个数的组合数量
    fenmu=1
    fenzi=1
    for i in range(m-n+1,m+1):
        fenzi=fenzi*i
    for j in range(1,n+1):
        fenmu=fenmu*j
    return fenzi/fenmu

 

def combineallcount(m_num,n_num):##m个数,第一次抽取n1个,剩余中第二次抽n2个,依此第n次剩余中抽取nn个,则所有组合数量
    allcombine=1
    m=len(m_num)#待抽取的m的初始值
    n=0
    for i in n_num:#抽取次数
        n=n+i
    if m>=n:#抽取n的总个数应小于等于m的个数
        for j in n_num:#计算每次抽取的组合数量,计算总组合的数量
            allcombine=allcombine*combinecount(m,j)
            m=m-j#下个抽取环节剩余的m的个数
        return allcombine
    return print("抽取n的个数大于m的个数")
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值