javascript - 解决循环组合程序问题的程序

标签 javascript node.js algorithm math combinatorics

我了解如何通过手工解决问题,但我想创建一个 Javascript 程序来为 (c,r) 完成此操作,其中 c 是容器,r 是岩石。
设置
您有 4 block 相同类型的无法区分的岩石。您还有 10 个容器。每个容器可以容纳 0 block 石头或 1 block 石头。所有 4 block 石头都需要在每个排列中使用,在每个排列中留下 6 个 0。
我相信基于组合生成器应该有大约 210 种可能性(10!)/(4!*(10-4)!)。
例如,这些是可能性的例子:

1111000000
1110100000
1110001000
0000001111
0101010100
我正在寻找的是一个 javascript 函数,它将吐出 210 个数组,因此它是 [1,1,1,1,0,0,0,0,0,0]输入一些岩石和容器。

最佳答案

我尝试了@JonTrent 的方法(从 02^c - 1 ),这是一个非常聪明的方法:

function getCombinations(c, r) {
  const max = Math.pow(2, c);
  const res = [];
  for (let i = 0; i < max; i++) {
    const binary = i.toString(2);
    if (binary.split("1").length - 1 === r) {
      res.push(
        binary.padStart(c, '0')
              .split('')
              .map(n => parseInt(n, 10))
      );
    }
  }
  return res;
}

const res = getCombinations(10, 4);
// [
//  [0,0,0,0,0,0,1,1,1,1],
//  [0,0,0,0,0,1,0,1,1,1],
//  [0,0,0,0,0,1,1,0,1,1]
//  ...
// ]

document.body.innerHTML = `<pre>${res.map(x => x.join('')).join('\n')}</pre>`;
console.log(`${res.length} combinations found!`);

关于javascript - 解决循环组合程序问题的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62624462/

相关文章:

javascript - 两组复选框的警告消息

javascript - 是否可以动态更新 extjs5 中的绑定(bind)?

c++ - 条件运算符不允许程序终止

javascript - 如何从 e.currentTarget.value JQuery 获取子属性

node.js/v8 将大文件读入内存

javascript - 无法使用 Lighttpd 访问 Raspberry Pi 上的 socket.io.js [Node.JS & Socket.IO]

Javascript Node js 搜索并返回文件中包含字符串的行

java - 在 Java 中获取一个数字的因子数量的最快方法是什么

algorithm - 为什么我得到一个充满 NaN 的权重矩阵?

javascript - 通过创建的 HTML 代码调用函数