【发布时间】: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