华为机考二星题

#原创文章,转载请注明出处

有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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值