您的位置:首页 > 其它

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

2017-03-20 16:27 363 查看
#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-个组合数
#如1234,m=2个元素的组合数等于1+[2,3,4](234的m-1组合),2+[3,4](34的m-1组合),3+[4]
#如1234,m=3个元素的组合数等于1+[23,24,34](234的m-1组合),2+[34](34的m-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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐