【发布时间】:2021-03-30 13:15:29
【问题描述】:
问题:
编写一个有 2 个输入参数的函数:
items:2 元组正整数的列表/向量(即 >= 1)target:正整数(即 >= 1)找到一个元组子集,这样:
- 子集的第一个元组元素之和大于或等于输入
target。- 子集的第二个元组元素的总和是minimal,我们称这个总和值为
best。该函数应该只返回
best。此外,保证有解决方案。换句话说,所有第一个元组元素的总和总是大于或等于目标。这是这样一个函数的伪代码签名:
(items: List<(int, int)>, target: int) -> int这里有一些例子……
示例 A:
- 项目 =
[(25,50), (49,51), (25,50), (1,100)]- 目标 =
50- 回答 =
100示例 B:
- 项目 =
[(25,50), (49,51), (25,50), (1,5)]- 目标 =
50- 回答 =
56
这是我简单的指数时间解决方案:
- 遍历所有可能的子集(因此是指数时间)
- 对于每个子集,计算第一个元组元素的总和
- 如果该总和大于或等于目标,则计算第二个元组元素的总和
- 如果新的总和是迄今为止找到的最小的,则更新最小值
我还尝试确定问题的数学属性是否允许使用快捷方式,例如按最大的“第一个元素除以第二个元素”比率检查项目(最划算)。但是,正如示例 A 所示,这并非对所有情况都有效。
这是一个非多项式问题吗?如果不是,如何在多项式时间内求解?
【问题讨论】:
-
@FélixPoulin-Bélanger 网站的不同部分对此有不同的感受。关注[算法]的人不介意,但关注[python]和[性能]的人可能想要更多实际问题。这个问题有点难——就像knapsack problem 一样,只是你要决定从背包中取出哪些物品,以便遵守重量限制,并且你试图最大化背包中剩余的价值。