#原创文章,转载请注明出处
有N个旅行团,只有一辆大巴,核载人数M。要求安排旅行团一次坐满大巴
输入描述:
第一行有旅行团人数信息
第二行大巴核载人数
输出描述:
大巴上各个旅行团人数,数组形式
举例:
输入:
3,2,4,1,2
5
输出:
[3, 2]
[3, 2]
[2, 1, 2]
[4, 1]
思路:递归,穷举所有可能
#强化理解:集合中有4个元素,求全排列
递归第一层,有四个分支(四个数),递归第二层有三个分支(剩余三个数),递归第三层有两个分支,在最后一层输出最末一层的分支上经过了哪些路径并输出#详见递归求全排列。
全排列应用在“组合”场景下会有重复的情况,所以策略改进为,有一个数组,取出N个数,第K次取数的索引大于第K-1次取数的索引。则可以避免重复的情况#论证:全排列中重复的情况按照数值大小排序必定能转化为该策略下的序列,该策略不会引起重复,所以能去重。
递归代码如下:
def fun(data,path,M):
#print(data,path)
if len(data)==0 or sum(path)==M:
if sum(path)==M:
print(path)
else:
for i in range(len(data)):
fun(data[i+1:],path+[data[i]],M)#传递之后的数据给下一层,避免重复
测试:
data=[3,2,1,2,5]
fun(data,[],5)
输出:
[3, 2]
[3, 2]
[2, 1, 2]
[5]