假设我们有一个数字数组,如下所示:
(2, 1, 4, 1, 3, 5, 6, 1, 2, 6, 3)
帮助我编写一个函数,它将以满足以下条件的方式选择输入数组的 3 个(或更少)元素):
- 结果组的元素之和(例如,以数组的形式)不应超过 6。
- 当您可以选择两个元素时,您不能选择一个元素;当您可以选择三个项目时,您不能选择两个项目。但是,您必须从具有最高优先级(即具有较低索引)的元素开始
- 在原始数组中,具有较低索引的元素优先于具有较高索引的元素。那些。$input[0] 比 $input[1] 更重要。优先级,我的意思是它们更优先放置在结果数组中。
示例 1
入口:
(1, 7, 4, 2, 3, 1, 6, 1, 2, 6, 3)
1-的优先级最高,1小于6,直接拿走。我们不取 7,因为 1 + 7 > 6。下一个元素是 4,我们取它,因为 1 + 4 = 5 < 6。我们不取元素 2,因为 5 + 2 = 7 > 6。同样,我们不要取 3。结果,我们得到 (1, 4, 1)
出口:
(1, 4, 1)
示例 2
入口:
(2, 1, 4, 1, 3, 5, 6, 1, 2, 6, 3);
出口:
(2, 1, 1)
示例 3
入口:
(3, 4, 5, 2, 3, 1, 6, 1, 2, 6, 3);
出口:
(3, 2, 1)
例 4
入口:
(7, 4, 5, 2, 3, 1, 6, 1, 2, 6, 3);
出口:
(4, 2)
例 5
入口:
(7, 6, 1, 2, 3, 1, 6, 1, 2, 6, 3);
出口:
(6)
最多结果是“表”。语言不重要(思想重要),PHP更好。
是这样的:
该问题的正确解决方案如下所示:
虽然看似简单,但这却是一个经典的“背包问题”,需要对最后一个元素的每个数字的选项进行完整的枚举。
请注意,问题的条件不包含有关初始数字范围的信息(特别是,它们可以是负数)。但这很容易考虑。
问题的约束使我们能够减少枚举。
OP 应该使用“贪婪”算法解决问题,该算法并不总是给出正确的结果。
PHP 程序:
结果: