Java 如何以最小的时间复杂度找到和等于k的最长子集(powerset)的长度?
给定一个整数数组,我尝试使用可能的时间复杂度来查找和等于k的最长子集(powerset)。 e、 g.如果inputArr=[1,2,8,1,1,7]和k=10,那么输出应该是4,因为总和等于10的最长子集是[1,1,1,7] 编辑:我可能忘记了一个重要的细节;数组的元素都是正的和非零的 我使用了我在Geeksforgeks上发现的算法: 代码运行良好,但我唯一的问题是执行时间。我应该在线提交,当我提交它时,由于超时,执行终止Java 如何以最小的时间复杂度找到和等于k的最长子集(powerset)的长度?,java,algorithm,subset,powerset,Java,Algorithm,Subset,Powerset,给定一个整数数组,我尝试使用可能的时间复杂度来查找和等于k的最长子集(powerset)。 e、 g.如果inputArr=[1,2,8,1,1,7]和k=10,那么输出应该是4,因为总和等于10的最长子集是[1,1,1,7] 编辑:我可能忘记了一个重要的细节;数组的元素都是正的和非零的 我使用了我在Geeksforgeks上发现的算法: 代码运行良好,但我唯一的问题是执行时间。我应该在线提交,当我提交它时,由于超时,执行终止 int maxSubLength=0; for (
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);
}
int maxSubLength=0;
对于(int i=1;i<(1我们可以在O(n*k)
时间和O(k)
空间中使用动态编程来解决这个问题。JavaScript代码:
函数f(A,K){
设m=新数组(K+1)。填充(0)
为了(让a的a){
对于(设k=k;k>=a;k--)
if(m[k-a])
m[k]=数学最大值(m[k],1+m[k-a])
m[a]=数学最大值(m[a],1)
}
返回m[K]
}
变量A=[1,2,8,1,1,7]
变量K=10
log(f(A,K))
无法快速生成大型集合的所有子集,因为大小为n的集合有2个ⁿ 超集。你能发布你试图解决的问题的完整文本,包括对集合大小和/或其值的任何限制吗?@ruakh我可能忘记了一个重要的细节;数组的元素都是正的且非零。以下是问题的全文:给定一个正n个非零整数数组,求和等于k的最长整数子集的长度。"换句话说,用大O表示法,你需要达到什么样的时间复杂度?@JoshW。我真的不确定。问题没有具体说明这一点,我也不知道解决这个问题的最佳时间复杂度是什么。似乎这是一个子集求和,额外要求找到与给定值求和的最大可能子集。它可以是b通过稍微修改算法,它的运行时间肯定比计算所有子集要好。非常感谢,伙计!这真的帮助了我!