首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >求解循环组合规划问题的程序设计

求解循环组合规划问题的程序设计
EN

Stack Overflow用户
提问于 2020-06-28 15:16:31
回答 4查看 131关注 0票数 7

我知道如何手工解决问题,但我想创建一个Javascript程序来完成(c,r),其中c是容器,r是石头。

设置,您有4个相同类型的不可区分的岩石。你还有10个容器。每个容器可以容纳0块岩石或1块岩石。所有4块岩石都需要在每种安排中使用,每种安排留下6点。

我相信附近应该有210种可能性(10!)/ (4!* (10-4)!)基于组合生成器。

例如,以下是各种可能性的例子:

代码语言:javascript
运行
复制
1111000000
1110100000
1110001000
0000001111
0101010100

我要找的是一个javascript函数,它将输出210个数组,这样它就是[1,1,1,1,0,0,0,0,0,0],输入了许多岩石和容器。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-06-28 15:45:52

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

代码语言:javascript
运行
复制
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!`);

票数 3
EN

Stack Overflow用户

发布于 2020-06-28 15:33:34

我只是从这里复制了答案,Permutations in JavaScript?

然后在输入数组中添加任意数量的空间。那就从那个岗位上尝试任何你想要的解决方案。

代码语言:javascript
运行
复制
function permutator(inputArr) {
  var results = [];

  function permute(arr, memo) {
    var cur, memo = memo || [];

    for (var i = 0; i < arr.length; i++) {
      cur = arr.splice(i, 1);
      if (arr.length === 0) {
        results.push(memo.concat(cur));
      }
      permute(arr.slice(), memo.concat(cur));
      arr.splice(i, 0, cur[0]);
    }

    return results;
  }

  return permute(inputArr);
}

console.log(permutator(['a', ' ', 'b', 'c']))

票数 0
EN

Stack Overflow用户

发布于 2020-06-28 16:06:17

您可以选择下一个元素来交换,并将右边的值重排到最右边。

代码语言:javascript
运行
复制
function perm(string) {
    var array = [...string],
        l = array.length - 1,
        r = array.length - 1;
    
    // either starts with zero from end or with one and get only ones
    while (array[l] === '0') l--;
    while (array[l] === '1') l--;
    if (l < 0) return;
    [array[l], array[l + 1]] = [array[l + 1], array[l]];
    while (r > ++l) {
        if (array[l] === '1') {
            [array[l], array[r]] = [array[r], array[l]];
            r--;
        }
    }
    return array.join('');
}

var string = '0000001111',
    i = 0,
    log = document.getElementById('out');
    
do out.innerHTML += `${(++i).toString().padStart(3, ' ')} ${string}\n`;
while (string = perm(string));
代码语言:javascript
运行
复制
<pre id="out"></pre>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62624462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档