华为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