c# - 给定自定义范围,我如何才能找到该范围内的所有 n 个数字的组合,从而产生目标平均值?
问题描述
假设我想要从 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
这使得解决方案可以非常快速地用蛮力处理。c
循环遍历和的可能值d
;计算结果a
和b
值,然后打印。请注意,您的循环可能会受到其他限制:
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
这就是要点;实现细节留给读者练习。:-)
推荐阅读
- swift - 在 Swift 中求和两个泛型值的最佳方法
- javascript - Firebase 功能:使用保留的托管 url 时设置区域
- gruntjs - Grunt 插件在哪里?
- c - C 二进制文件中的整数:使用 readelf、objdump 或类似工具查看它
- python - 如何将拒绝消息添加到 Discord py 角色限制命令
- terraform - 结合 terraform 中的两个插值函数将 access_keys 分配给用户列表
- node.js - 我可以使用此方案安全地包装函数吗?
- oracle - 插入查询执行速度太慢
- python - 使用 for 循环更新范围内的单元格
- reactjs - 反应如何在传递的函数中使用状态