递归求解一组元素的所有排列情况&包含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)
相关文章推荐
- 求出一组元素的所有排列情况&所有包含m个元素组合情况&网易笔试题-合唱团
- 多个数组间元素排列组合问题求解(Java实现) 标签: 递归排列组合循环
- 递归求解从数组中取出n个元素的所有组合
- 华为笔试.利用递归进行穷举123456的所有组合情况
- 输出数组的所有元素的排列组合(递归)
- 递归输出一组元素的排列组合方式
- 递归求解几类排列组合问题(二、全组合排列)
- 递归求解几类排列组合问题(三、非重复组合排列)
- 比如“1,2,3....10”,1到10这10个数,显示他的所有可能组合情况(排列顺序无所谓)
- 递归列举从数组b()中选出某些元素(允许重复)使其和等于num的所有组合
- 百度2014校园招聘算法——给出一组数据A=[a_0, a_1, a-2, ... a_n](其中n可变),打印出该数值元素的所有组合。
- 采用递归方式输出N个不同元素所有排列方式
- 从n个元素中选择k个的所有组合(包含重复元素)
- 输出N个数中取M个数的所有组合,排列情况
- 递归求解几类排列组合问题(四、普通选择性组合排列)
- 剑指Offer28字符串的排列(递归和非递归实现)扩展有重复元素的排列,字符串的组合种类
- 递归求解几类排列组合问题(一、类循环组合排列)
- 输入两个整数n和m,从数列1,2,3,...,n中随意取几个数,使其和等于m,将其所有可能的组合列出来。 递归求解
- 百度2013年校园招聘一道笔试题--三位密码组合问题递归求解
- list中的组合所有情况(无需排列,只是组合所有的情况)