Akina和Rajesh H提供了优雅的解决方案,适用于问题中的示例。然而,这种方法有一个缺点,即它们太早停止。如果您有一个超出预算的大型项目,无论是单独还是累计总量,它都会停止前一个项目,而不是跳过不合格项目并继续寻找其他合格项目。例如:
在最好的情况下,我按时间顺序替换了第二个大型项目。这会推动累积超过预算,所以它停止了一个项目而不是添加本来预算内的项目。
在第二种情况下,我使最早的项目大于预算。它不是跳过它而是寻找后来合格的,而是停止并且不返回任何东西。
我的假设是,目标是填补预算,首先优先考虑最老的项目。如果旧项目不符合预算,我认为我们不应该停止关注这一点。
这是一个没有问题的简单解决方案。
我做了几个大的价值替换只是为了说明公式是如何工作的。
作为第一步,我按时间顺序对数据进行了排序。第一个公式(在D4中):
=IF(C4>$C$1,"",C4)
如果第一个值按时间顺序低于预算金额,则使用它,否则保留空值。其余公式从第二个值复制(在D5中):
=IF(SUM($D4:D$4)+C5>$C$1,"",C5)
这总结了之前的任何合格值,并为该项目添加了值。如果项目将总计超出预算,则会发布null,否则会添加项目的值。它为每个后续项目执行此操作,因此您始终可以获得所有符合条件的项目。
请注意,您可以改进策略。例如,对于我的示例中的值,您的规则停止在$ 2400。您可以通过添加其他优先级来更接近预算,这些优先级允许选择较大的后期项目而不是较早的项目。如果您的项目列表与您描述的一样长,那么可能会有许多组合在一起,可以填补预算。通过放宽最早的第一个约束,您可以更接近预算。您还可以将年龄与项目规模等其他目标相结合; 例如,完成一些大项目而不是许多小项目。