【问题标题】:List all sums of k objects in set of n integers IN DESC ORDER按 DESC ORDER 列出 n 个整数集中 k 个对象的所有总和
【发布时间】:2020-05-05 11:51:15
【问题描述】:

我有一大组 n 个整数。我需要在该列表中选择 k 个元素,以便它们从最大到最小求和。选择的每个子集都必须对某些规则有效(规则无关紧要)。我想找到最大和的子集也是有效的。

例如,使用一小组数字(10、7、5、3、0)、子集大小为 3 和一个简单的规则(总和必须为素数),代码将如下所示:

10, 7, 5 = 22 -> NOT PRIME, KEEP GOING
10, 7, 3 = 20 -> NOT PRIME, KEEP GOING
10, 5, 3 = 18 -> NOT PRIME, KEEP GOING
10, 7, 0 = 17 -> PRIME, STOP

我知道我可以将每个组合都放在一个列表中,按降序排列,然后逐个递减直到总和通过测试,但这在空间和时间上似乎都非常低效,尤其是如果我有一组像 100 这样的大小和 8 的子集大小。这就像我必须计算的 1860 亿个组合。

有没有办法在一个简单的循环中做到这一点,我从最大的总和检查有效性开始,然后计算并转到下一个可能的最大总和并检查有效性等?比如:

// Assuming set is ordered, this is the largest possible sum given the subset_size
int sum = set.Take(subset_size).Sum();

while (!IsValid(sum))
{
    sum = NextLargest(set, subset_size, sum);
}

bool IsValid (int sum)
{
    return sum % 2 == 0;
}

int NextLargest (int[] set, int subset_size, int current_sum)
{
    // Find the next largest sum here as efficiently as possible
}

【问题讨论】:

  • 您可以尝试为此使用前缀总和,并将先前元素的总和存储为当前值

标签: c# algorithm sorting recursion dynamic-programming


【解决方案1】:

您无需查看每个组合,只需查看总和较大的组合即可。

按降序遍历集合并检查总和。跟踪迄今为止发现的最大有效金额。当无法获得更大的总和时,跳出循环。例如,给定子集大小 5,您找到了一个有效的总和 53。在某些时候,您正在考虑一个以 10 开头的子集。由于数字是按降序排列的,此时您可以获得的最大总和是 50。所以这条路可以放弃。这应该会显着减少您的解决方案空间。

【讨论】:

    猜你喜欢
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2014-01-27
    相关资源
    最近更新 更多