递归求解一组元素的所有排列情况&包含m个元素的组合情况&网易笔试题-合唱团

#encoding:utf-8


#打印排列组合-递归:
#每次取序列中的一个元素作为头,每个头引导包含的排列情况数  等于剩下其余元素的所有排列情况
#因此递归执行这个过程,当前序列只剩一个元素时,则排列就是它自己
def perm_sub(all):
    result=[]
    if len(all)==1:
        result.append(all[0])
    else:
        for i in xrange(0,len(all)):
            oldFirst=all[0] #交换当前的头元素
            all[0]=all[i]
            all[i]=oldFirst
            preResult=perm(all[1:])
            for j in xrange(0,len(preResult)):
                result.append(all[0]+preResult[j])
            all[i]=all[0]  #交换后要换回去
            all[0]=oldFirst
    return result

#视元素为字符串列出排列情况,入口函数
def perm(all):
    for i in xrange(0,len(all)):
        all[i]=str(all[i])
    return perm_sub(all)

#打印所有的组合情况
def comb(all):
    for i in xrange(0,len(all)):
        all[i]=str(all[i])
    result=[]
    for i in xrange(1,len(all)+1):
        result.extend( comb_sub(all,i) )
    return result

#打印包含m个元素的组合情况,m个元素的组合数=第一个元素+剩下序列元素的m-个组合数
#1234m=2个元素的组合数等于1+[2,3,4](234m-1组合),2+[3,4](34m-1组合)3+[4]
#1234m=3个元素的组合数等于1+[23,24,34](234m-1组合),2+[34](34m-1组合)
def comb_sub(all,m):
    result=[]
    if m==1:
        result=all
    else:#每次循环将起始位置往后移1,并且保证剩下的元素数大于m-1组合数
        for i in xrange(0,len(all)-(m-1) ):#最后至少要剩下m-1个数,如果剩下的数量都少于要组合的数量就无法组合了
            preResult=comb_sub(all[i+1:],m-1)
            for j in xrange(0,len(preResult)):
                result.append( all[i]+ preResult[j])

    return result





#all中的m个元素的所有组合情况,要求元素之间的位置间隔不超过d
#按组合情况的求解方法求解,添加组合时与前一个元素的间隔不超过d的条件
def wangyi_sub(all,m,pre,d):#pre=0表示当前是第一个头,=1表示不是第一个头
    result=[]
    if m==1:
        result=all[:d]
    else:
        if pre==0:
            maxStart=len(all)-(m-1)
        else:
            maxStart=d if d < len(all)-(m-1) else len(all)-(m-1)
        for i in xrange(0,maxStart):
            preResult=wangyi_sub(all[i+1:],m-1,1,d)
            for j in xrange(0,len(preResult)):
                result.append( all[i] * preResult[j])
    return result


# print perm(all)
# print comb(all)

#print comb_sub(all,2)

all=[7,4,7]
print wangyi_sub(all,2,0,50)
print max(wangyi_sub(all,2,0,50))

# all=['1','2','3','4','5','6','7','8','9']
# print wangyi_sub(all,3,0,2)
# print max(wangyi_sub(all,3,0,2))

def wangyiniuke():
    import sys
    n=sys.stdin.readline()
    s=sys.stdin.readline().split(' ')
    for i in xrange(0,len(s)):
        s[i]=int(s[i])
    kd=sys.stdin.readline().split(' ')
    k=int(kd[0])
    d=int(kd[1])
    i=0
    allResult=wangyi_sub(s,k,0,d)
    print max(allResult)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值