如何列出等于X的N个指数的所有组合

时间:2018-04-23 22:43:46

标签: arrays algorithm sorting sum

我正在尝试使用以下规则返回数组:
1.所有与X
总和的独特组合 2.每个号码都分配了一个字母
3.每个字母只能使用一次

// Cartesian join
function cartesian() {
  let r = []
  let arg = arguments
  let max = arg.length-1

  function helper(arr, i) {
    for (let j=0, l=arg[i].length; j<l; j++) {
      let a = arr.slice(0); // clone arr
      a.push(arg[i][j]);
      if (i==max)
        r.push(a);
      else
        helper(a, i+1);
    }
  }
  helper([], 0);
  return r;
}

let a = ['A','B','C'];
let a1 = ['1','2','3'];

let arrays = cartesian(a, a1)

for(let i=1; i<arrays.length; i++) {
  file[i] = arrays[i].join('').toString();
}

笛卡尔连接将输出[A1,B1,C1,A2,B2 ......]

然后我如何将N个索引的组合加起来为X,而只使用每个字母索引的一个数字?

其中N是适用于总和的字母数。 其中X是总和。

例如,如果N = 3且X = 5,

输出为{A1,B1,C3},{A1,B2,C2},{A1,B3,C1},{B2,C3},{B3,C2}等......

1 个答案:

答案 0 :(得分:0)

在您的示例中,您最多可以使用任意数字3次,因此我将从数组开始

[1,1,1,2,2,2,3,3,3]

然后查找总和为5的所有组合,同时使用最多3个条目并且仅使用每个条目一次。

找到数字后,您可以分配字母。例如,数字1,1,3可以表示为A1,B1,C3A1,B3,C1A3,B1,C1。如果您有三个不同的数字,将有六种方式来分配字母。

简而言之,首先找到数值解,然后分配字母。