解决方案
方法一:动态规划
思路
如果该计划的利润 的话,我们无需考虑利润问题,因为它肯定超过盈利所需的阀值。类似地,如果该计划需要的人数 的话,我们无需考虑该计划,因为它对于这个帮派来说太大了。
因此,边界足够小,可以使用动态编程。让我们跟踪 cur[p][g]
,它包括有盈利能力的计划数量 以及要求参与的团伙成员数量 :除了我们会称(不改变答案)所有计划至少获利为 P
美元而不是确切地 P
美元。
算法
跟踪如上所定义的 cur[p][g]
,让我们了解它是如何变化的,当我们考虑一个额外的犯罪,获利 p0
且需要 g0
名成员。我们将更新后的数目放入 cur2
。
对于每个利润 p1
、需要 g1
的计划,该计划加上我们考虑的额外犯罪 (p0, g0
) ,其利润为 p2 = min(p1 + p0, P)
,需要 g2 = g1 + g0
人。
复杂度分析
-
时间复杂度:,其中 是该团伙可能做到的犯罪数目。
-
空间复杂度:。