你怎么能以最小的时间复杂度找到总和等于 k 的最长子集(powerset)的长度?
how can you find the length of the longest subset (powerset) with sum equal to k with least time complexity?
给定一个整数数组,我试图使用租用可能时间复杂度找到总和等于 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);
}
有没有更快的算法?我尝试了一个递归的,但没有帮助。
我们可以在 O(n*k)
时间和 O(k)
space 时间内用动态规划解决这个问题。 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))
给定一个整数数组,我试图使用租用可能时间复杂度找到总和等于 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);
}
有没有更快的算法?我尝试了一个递归的,但没有帮助。
我们可以在 O(n*k)
时间和 O(k)
space 时间内用动态规划解决这个问题。 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))