c# - 给定自定义范围,如何找到该范围内 n 个数字的所有组合,从而达到目标平均值?

标签 c# algorithm

假设我想要从 83 到 86 的 10 个项目的所有组合,其平均值为 84。一些解决方案是:

+----+----+----+----+
| 83 | 84 | 85 | 86 |
+----+----+----+----+
|  0 | 10 |  0 |  0 |
|  1 |  8 |  1 |  0 |
|  2 |  6 |  2 |  0 |
|  3 |  4 |  3 |  0 |
+----+----+----+----+

是否有已知的算法可以找到我正在寻找的组合?特别是如果有一个用 C# 编写的,我将不胜感激。

最佳答案

这是一个平凡的线性组合。从每个值中减去 84;他们现在是 [-1, 0, 1, 2]。 0 是一个填充值——它不影响平均值。将计数命名为 a-d,我们有:

a, b, c, d >= 0
a = c + 2d
a + b + c + d = 10

这使得解决方案可以非常快速地用蛮力处理。遍历 cd 的可能值;计算生成的 ab 值,并打印。请注意,您的循环可能会受到其他限制的限制:

for d in [0 .. 3]
    for c in [0 .. (10 - 3*d) / 2]   // c can take only half the remaining count;
                                     // a gets the rest.
        a = c + 2*d
        b = 10 - (a + c + d)
        print (a, b, c, d)

输出:

0 10 0 0
1 8 1 0
2 6 2 0
3 4 3 0
4 2 4 0
2 7 0 1
3 5 1 1
4 3 2 1
5 1 3 1
4 4 0 2
5 2 1 2
6 1 0 3

这就是要点;实现细节留给读者作为练习。 :-)

关于c# - 给定自定义范围,如何找到该范围内 n 个数字的所有组合,从而达到目标平均值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56754433/

相关文章:

c# - 如何使用 Visual Studio 验证 swagger Rest API

algorithm - 动态规划 (DP) 中的重叠子问题是什么?

algorithm - rsync 算法中的滚动校验和

algorithm - 关于一些 if 语句的基本编程

performance - 对数组元素进行排序的最高效算法是什么?

c# - 如何从sql日期中删除时间

c# - 如何使用自定义 MembershipProvider?

c# - 如何提高 DataSet 到 List<T> 的性能?

c# - 了解数据绑定(bind)

algorithm - 比较给定步骤的两种算法的复杂性