【问题标题】:how can you find the length of the longest subset (powerset) with sum equal to k with least time complexity?如何找到总和等于 k ​​且时间复杂度最小的最长子集(幂集)的长度?
【发布时间】:2019-10-15 00:24:57
【问题描述】:

给定一个整数数组,我试图使用租约可能的时间复杂度找到总和等于 k ​​的最长子集(幂集)。 例如如果 inputArr= [1, 2, 8, 1, 1, 7] 并且 k= 10,那么输出应该是 4,因为总和等于 10 的最长子集是 [1, 1, 1, 7]。

编辑:我可能忘记了一个重要的细节;数组的元素都是正数且非零。

我使用了在 geeksforgeeks 上找到的算法: https://www.geeksforgeeks.org/finding-all-subsets-of-a-given-set-in-java/

代码运行良好,但我遇到的唯一问题是执行时间。我应该在线提交,当我提交时,由于超时,执行终止。

    int maxSubLength=0;
    for (int i = 1; i < (1<<n); i++)   //n is the length of inputArr
    {
        int sum=0, length=0;

        for (int j = 0; j < n; j++)
          if ((i & (1 << j)) > 0)
          {
                sum+=inputArr[j];
                length++;
                if (sum>k)
                   break;
          }  

        if (sum==k)
            maxSubLength=Math.max(maxSubLength, length);
    }

有没有更快的算法?我尝试了递归,但没有帮助。

【问题讨论】:

  • 没有快速的方法来生成一个大集合的所有子集,因为一个大小为 n 的集合有 2ⁿ 个超集。您能否发布您要解决的问题的完整文本,包括对集合大小和/或其值的任何限制?
  • @ruakh 我可能忘记了一个重要的细节;数组的元素都是正数且非零。以下是问题的全文:“给定一个正 n 非零整数数组,求和等于 k ​​的最长整数子集的长度。”和 1
  • 换句话说,大 O 表示法的时间复杂度需要达到多少?
  • @JoshW。我真的不确定。问题没有具体说明,我也不知道可以解决这个问题的最佳时间复杂度是多少。
  • 似乎这是子集总和,额外要求找到总和为给定的最大可能子集。可以通过对subset sum算法稍加修改来解决,其运行时间肯定比计算所有子集要好。

标签: java algorithm subset powerset


【解决方案1】:

我们可以通过O(n*k) 时间和O(k) 空间中的动态规划来解决这个问题。 JavaScript 代码:

function f(A, K){
  let m = new Array(K + 1).fill(0)
    
  for (let a of A){
    for (let k=K; k>=a; k--)
      if (m[k - a])
        m[k] = Math.max(m[k], 1 + m[k - a])

    m[a] = Math.max(m[a], 1)
  }
  
  return m[K]
}

var A = [1, 2, 8, 1, 1, 7]
var K = 10

console.log(f(A, K))

【讨论】:

  • 非常感谢,伙计!这对我很有帮助!
猜你喜欢
  • 1970-01-01
  • 2017-03-16
  • 2021-10-01
  • 2015-11-08
  • 2012-10-22
  • 2021-06-04
  • 2019-12-25
  • 2016-12-20
  • 1970-01-01
相关资源
最近更新 更多