华为2023 11月机考题

华为2023 11月机考题

100+200+300

100分试题

200分试题

暂无,编辑中

300分试题

题目很长,抽象出来之后描述如下:
给你一个数组,里面包含了很多物体的重量(保证每个物体重量都不相同),给你一个重量的下界low和上界high。返回所有满足总重量在界限范围内的搭配方式的总数。例如:

输入
350
500
100 200 300
输出
7

可能的搭配有7种:
100 × 4 100\times4 100×4
100 × 5 100\times5 100×5
100 × 3 100\times3 100×3 + 200 × 1 200\times1 200×1
100 × 2 100\times2 100×2 + 200 × 1 200\times1 200×1
100 × 1 100\times1 100×1 + 200 × 2 200\times2 200×2
200 × 2 200\times2 200×2
500 × 1 500\times1 500×1

代码如下:

def print_combinations(items, low, high):
    def print_recursive(index, current_sum, counts):
        # 当前总和超出上限时直接返回
        if current_sum > high:
            return 0

        count = 0
        # 当前总和在区间内时,打印组合并计数加1
        if low <= current_sum <= high:
            combination = ' + '.join(f"{items[i]}*{c}" for i, c in enumerate(counts) if c > 0)
            print(combination)
            count = 1

        # 遍历剩余物品
        for i in range(index, len(items)):
            counts[i] += 1  # 选择当前物品
            count += print_recursive(i, current_sum + items[i], counts)
            counts[i] -= 1  # 回溯,不选择当前物品

        return count

    # 初始化每个物品的计数为0
    counts = [0] * len(items)
    return print_recursive(0, 0, counts)
if __name__ == '__main__':

    # 测试
    items = [100, 200, 500]
    low = 350
    high = 500
    total_combinations = print_combinations(items, low, high)
    print(total_combinations)

运行结果:

100*4
100*5
100*3 + 200*1
100*2 + 200*1
100*1 + 200*2
200*2
500*1
7
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值