【问题标题】:Finding or arranging all combinations of given numbers [duplicate]查找或排列给定数字的所有组合[重复]
【发布时间】:2023-03-19 15:08:01
【问题描述】:

我希望你一切都做得很好。 我有一个有趣的问题,一直困扰着我。它是关于以精确的顺​​序生成组合。 例如,我有 4 个变量(可以变化),这 4 个变量有一些增加的限制,例如在这种情况下 2。所以我想按以下顺序生成 2d 矩阵:


0 0 0 0
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
1 1 0 0
1 0 1 0
1 0 0 1
0 1 1 0
0 1 0 1
0 0 1 1 
1 1 1 0
0 1 1 1
1 1 1 1 
2 0 0 0
0 2 0 0
0 0 2 0
0 0 0 2
2 1 0 0
2 0 1 0 
......
......
and so on.

变量的数量(在这种情况下为 4)可以改变,并且最大限制(在这种情况下为 4)也可以改变。 即使我也找到了所有可能的组合,但我无法按此顺序排列它们。 如果有人给出答案,那就太好了。 干杯!

【问题讨论】:

  • @KenWhite 在逻辑上完全不同......这里我们只知道变量的输入数量和每个变量的最大限制。比您需要计算可能以千计的所有组合,并且比您需要构建一个包含所有这些组合数量的矩阵...例如,对于 4 个输入,每个输入的最大限制为 6,那么组合的数量将是 2041 . 希望你理解
  • 组合将从0 0 0 09 9 9 9,包括?
  • @FiddlingBits。是的,你是对的。
  • 因此,如果您说所有 4 个变量的限制为 9 9 9 9 ,那么将有 10,000 种可能的组合。

标签: c math matrix combinations arrangeoverride


【解决方案1】:

我假设你有 n 个变量,每个变量的范围都可以是 0 到 b-1。你想要的只是计算以 b 为底的 n 位数字。例如,如果 n = 2b = 3,那么你要产生的序列是

00
01
02
10
11
12
20
21
22

要实现这一点,请编写一个类似于以下内容的循环:(警告:未经测试的代码)

def inc(v, b):
  for i in range(len(v)):
     v[i] = v[i] + 1
     if v[i] < b:
        break
     v[i] = 0
def is_zero(v):
   for i in range(len(v)):
      if v[i] != 0:
         return False
   return True

v = [0, 0, 0]
b = 3
while True:
  print(v)
  inc(v, b)
  if is_zero(v):
     break

如果你仔细看看它是如何工作的,你应该知道如果你的变量有不同的上限,你应该如何概括它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2015-06-15
    相关资源
    最近更新 更多