当前位置: 首页 > 知识库问答 >
问题:

给定一组n个整数,列出sum>=k的所有可能子集

萧英光
2023-03-14

可能的子集:-

 {2},
 {3},
 {1,2},
 {1,3},
 {2,3}, 
 {1,2,3}

我只能想到一个朴素的算法,它列出集合的所有子集,并检查子集和是否>=k,但它是一个指数算法,列出所有子集需要O(2^n)。我能用动态规划在多项式时间内求解吗?

共有1个答案

宇文勇
2023-03-14

列出所有子集仍然是O(2^n),因为在最坏的情况下,您可能仍然必须列出除空子集之外的所有子集。

动态编程可以帮助您计算具有sum>=k的集合的数量

您可以自下而上跟踪从[1..k]范围中有多少子集相加到某个值。类似这样的方法将是O(n*k),它将只对小的k可行。

int DP[N][K];
int set[N];

//go through all elements in the set by index
for i in range[0..N-1]
   //count the one element subset consisting only of set[i]
   DP[i][set[i]] = 1

   if (i == 0) continue;

   //case 1. build and count all subsets that don't contain element set[i]
   for k in range[1..K-1]
       DP[i][k] += DP[i-1][k]

    //case 2. build and count subsets that contain element set[i]
    for k in range[0..K-1] 
       if k + set[i] >= K then break inner loop                     
       DP[i][k+set[i]] += DP[i-1][k]

//result is the number of all subsets - number of subsets with sum < K
//the -1 is for the empty subset
return 2^N - sum(DP[N-1][1..K-1]) - 1
 类似资料:
  • 给定一组未排序的整数,返回大小为k的所有子集(即每组有k个唯一元素),其总和为0。 所以我给了面试官以下解决方案(我在GeekViewpoint上研究过)。没有使用额外的空间,一切都做到位,等等。但当然成本是O(n^k)的高时间复杂度,其中在解决方案中。 但随后她提出了以下要求: 必须在答案中使用hashmap以降低时间复杂度 必须绝对地为一般情况提供时间复杂度 k=6时的提示,O(n^3) 她对

  • 所有要求要么打印最大的数组,要么打印长度最大的数组。我想打印那些连续数组的所有组合,这些数组可以被给定的数整除。我试图解决这个问题,并想出了这个解决方案 这段代码非常复杂,我可以想出一个更多的解决方案,使用两个复杂度为O(n^2)的循环。我们能以n^2倍的复杂度更好地做到这一点吗?

  • 我一直在练习算法问题,我遇到了这个问题。 给定一个数组(+VE和-VE),我必须找到一个连续的子数组,这样,和可以被任意数K整除,并且该子数组可能是最大和。对于 和,可被k整除的最大和子数组是 ,目前我所能想到的是,每个元素都有两种可能,要么包含在目标子数组中,要么不包含在目标子数组中。但这将是一个指数算法。 编辑:是否有可能在线性时间内解决这个问题。请帮忙

  • 我知道这是一个背包问题,其中权重和值相等,但我认为我在编码逻辑上犯了一个错误,因为即使对于数组中元素的数量(N)为50并且所需的最大总和(M)4500。 为了澄清这个问题,我们得到了一个由N个正整数和一个正整数M组成的数组。数组元素只能使用一次。我们必须找到这个数组的子集(不一定是连续的),使得总和最接近M,但不超过它。 这是我使用动态编程的尝试: 那么在我的代码中是否有任何可能的优化可以帮助我降

  • 我只能想到一个朴素的算法,它列出集合的所有子集,并检查子集的和是否和是否最小,但它是一个指数算法,列出所有子集需要O(2^n)。我能用动态规划在多项式时间内求解吗?

  • 例如,我们得到长度为5(n=5)的字符串“Number”,它由从1到a的所有数字组成(数字可以重复,但从1到a的所有数字都必须包含在字符串中,并且字符串的长度必须为n)。假设a=2并使用先前给定的条件生成示例性数字(或者更确切地说是数字序列),假设它是长度为5并由1和2组成的“12211”。现在让我们假设我们需要找到一个算法,该算法将在我们的字符串“Number”中找到所有可能的数字序列,其中每个