【问题标题】:Subset Sum using Bactracking使用回溯的子集总和
【发布时间】:2018-10-31 19:03:39
【问题描述】:

我试图使用回溯解决以下问题:

假设给你一个数字 N,你必须找到 将其写为 1、3 和 4 之和的不同方式。

这是我的尝试:

const backtrack = (array, index, result = [], sum) => {
  if (index >= array.length || sum < 0) {
    return 0;
  }
  if (sum === 0) {
    console.log(result);
    return 1;
  }

  return (
    backtrack(array, index, result.concat(array[index]), sum - array[index]) +
    backtrack(array, index + 1, result, sum)
  );
};

输入

const array = [1, 3, 4];
const index = 0;
const sum = 5;

输出

[ 1, 1, 1, 1, 1 ]
[ 1, 1, 3 ]
[ 1, 4 ]
3

正如你所看到的输出只有一半的组合。

缺少的组合是:

[ 1, 3, 1 ]
[ 3,1,1]
[ 4, 1 ]

我可以推断为什么会出现这种情况,因为我调用的右子树是使用 backtrack(array, index + 1, result, sum) 构造的 它查找索引大于当前索引的元素。任何人都可以给我提示我需要进行哪些更改以实现所需的输出?

【问题讨论】:

    标签: javascript backtracking subset-sum recursive-backtracking


    【解决方案1】:

    试试这个:

    backtrack = (array, index, result = [], remainig) => {
      if (index >= array.length || remainig < 0) {
        return 0;
      }
      if (remainig === 0) {
        console.log(result);
        return 1;
      }
      var sum = 0;
      for (var ind = 0; ind < array.length; ind++) {
        const curr = array[ind];
        sum += backtrack(array, 0, result.concat(curr), remainig - curr);
      }
      return sum;
    };
    

    在定义结果列表的第一个元素时,您必须遍历整个数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多