我最近在Python中提出了以下面试问题 - 给出一个数量 - 价值对的列表,找到其总和尽可能接近并且至少与其一样大的值组的最佳组合。 ,一些提供的价值。
例如,给定:[(1,$ 5),(3,$ 10),(2,$ 15)],以及36美元的期望值,答案是[(2,$ 15),(1,$ 10) )]或[(1,$ 15),(2,$ 10),(1,$ 5)]。原因是40美元是可以实现的最大金额大于或等于36美元,这是实现这一总和的两种方式。
我很难过。有没有人有解决方案?
答案 0 :(得分:1)
数字太小了你可以强行说出来:
const generateCanadianPostalCode = (separator = " ") => {
const letters = generateLetters(3);
const numbers = generateNumbers(3);
const sequence = interleave(letters, numbers);
const halves = [
sequence.slice(0, 3).join(""),
sequence.slice(3).join(""),
];
return halves.join(separator);
};
您可以为所有组合扩展此功能,只需将In []:
notes = [(1, 5), (3, 10), (2, 15)]
wallet = [n for a, b in notes for n in [b]*a]
combs = {sum(x): x for i in range(1, len(wallet)) for x in it.combinations(wallet, i)}
target = 36
for i in sorted(combs):
if i >= target:
break
i, combs[i]
Out[]:
(40, (5, 10, 10, 15))
词典理解替换为:
combs