【问题标题】:Subset Sum Problem: Returning a Variant of the Required Subset子集总和问题:返回所需子集的变体
【发布时间】:2020-03-20 02:39:01
【问题描述】:

问题描述:

给定一个整数列表和一个目标总和,我们需要返回另一个包含布尔值的列表。这个布尔列表表示我们正在寻找的子集。

示例:

输入:列表 (3, 34, 4, 12, 5, 2),目标 = 9。

输出:(假,假,真,假,真,假)(因为 4+5 = 9;注意这个解不是唯一的,但问题只要求一个任意解)。

我的尝试:

我开始编写一个方法来检查解决方案是否存在:

boolean subsetSumRec(List<Integer> list, int i, int sum) { //i is the index of the last element in list
    if(sum==0){
        return true;
    } else if(i<0 || sum<0){
        return false;
    }
    boolean include = subsetSumRec(list,i-1,sum-list.get(n));
    boolean exclude = subsetSumRec(list,i-1,sum);
    return include || exclude;
}

我创建了一个新的 ArrayList (type: Boolean) resultList,这将是输出。我的计划是在方法subsetSumRec 中更新resultList。它会是这样的:

private boolean subsetSumRec(List<Integer> list, int i, int sum) {
    if(sum==0){
        return true;
    } else if(list.size()<=0 || sum<0){
        return false;
    }
    res.add(true);
    boolean include = subsetSumRec(list,i-1,sum-list.get(i));
    boolean exclude;
    if(include == false){
        res.remove(true);
        res.add(false);
        exclude = subsetSumRec(list, i - 1, sum);
    }
    return include || exclude;
}

这没有给出所需的结果,但我不知道出了什么问题。如何优化?

如果在 subsetSumRec 中更新 resultList 不是一个选项,那么我必须摆脱检查是否有解决方案的方法并使用回溯算法(没有动态编程!)。我不知道如何从最后一个开始。有人可以给我提示如何解决这个问题的回溯算法(伪代码?)。

提前致谢。

【问题讨论】:

  • “这没有给出所需的结果,但我看不出有什么问题。如何优化?” 首先,您需要将问题编辑为具体说明结果有什么问题。 stackoverflow.com/help/minimal-reproducible-example 其次,优化给出错误答案的算法只意味着你会更快地得到错误答案。
  • if(include = false) 是什么意思?你是说if(include == false) 吗?

标签: java algorithm backtracking subset-sum


【解决方案1】:

这是 JavaScript 中的一个递归示例。如果解决方案可行,则返回第二个列表,否则返回false

function f(A, S, B=new Array(A.length).fill(false), i=A.length - 1){
  if (A[i] == S){
    B[i] = true
    return B
  }
    
  if (i == 0){
    if (A[i] == S){
      B[i] = true
      return B
    }
    return false
  }
  
  if (A[i] <= S){
    let maybeB = f(A, S - A[i], B, i - 1)
    if (maybeB){
      B[i] = true
      return B
    }
  }

  return f(A, S, B, i - 1)
}

var A = [3, 34, 4, 12, 5, 2]
var S = 9

console.log(JSON.stringify(A))
console.log(`Target: ${S}`)
console.log(JSON.stringify(f(A, S)))

S = 199
console.log(`\nTarget: ${S}`)
console.log(JSON.stringify(f(A, S)))

【讨论】:

    猜你喜欢
    • 2019-05-08
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多