代码之家  ›  专栏  ›  技术社区  ›  Varun Hegde

使用bacctracking的子集和

  •  2
  • Varun Hegde  · 技术社区  · 7 年前

    假设给你一个数N,你必须找到

    以下是我的尝试:

    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) 查找索引大于当前索引的元素。有没有人能给我一些提示,告诉我为了达到预期的效果我需要做哪些改变?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Donat    7 年前

    试试这个:

    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;
    };
    

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