我正在寻求帮助。我在 c 中有这段代码,它可以查找是否存在大小为 n
的数组 set[]
的子集,其总和为 sum
>。
示例:
set[] = {1,2,3};
n = 2;
sum = 4;
上面的代码将返回 true,因为 sized-2 子集 {1,3} = 4
对于以下情况也是如此:
n = 3;
sum = 6;
但错误:
n = 1;
sum = 4;
它适用于某些情况,但驱动程序中的情况无法为此代码中的驱动程序正确返回。请注意,我无法更改参数,并且不想使用任何类型的循环
代码在这里:
#include <stdio.h>
bool isSubsetSum(int set[], int n, int sum)
{
// Base Cases
if (sum == 0)
return true;
if (n == 0 && sum != 0)
return false;
if (set[n-1] > sum)
return isSubsetSum(set, n-1, sum);
return isSubsetSum(set, n-1, sum) || isSubsetSum(set, n-1, sum-set[n-1]);
}
// Driver program to test above function
int main()
{
int set[] = {6,5,6};
int sum = 12;
int n = 2;
if (isSubsetSum(set, n, sum) == true)
printf("Found a subset with given sum");
else
printf("No subset with given sum");
return 0;
}
JAVA适配:(也有错误)n是子集的大小
public static boolean isSubsetSum(int[] set, int n, int sum) {
int[] copy = new int[set.length - 1];
System.arraycopy(set, 0, copy, 0, set.length - 1);
// Base Cases
if (sum == 0 && n == 0)
return true;
if (set.length == 0) // fixed base case.
return false;
if (set[set.length - 1] > sum) {
return isSubsetSum(copy, n, sum);
}
return isSubsetSum(copy, n, sum) || isSubsetSum(copy, n-1, sum - set[set.length-1]);
}
最佳答案
您还需要将集合的大小作为参数传递。以下代码有效。
#include <stdio.h>
bool isSubsetSum(int set[], int m,int n, int sum)
{
if (n == 0 && sum == 0)
return true;
if(m==0)
return false;
if (set[m-1] > sum)
return isSubsetSum(set, m-1,n, sum);
return isSubsetSum(set, m-1,n, sum) || isSubsetSum(set, m-1,n-1, sum-set[m-1]);
}
// Driver program to test above function
int main()
{
int set[] = {6,5,6};
int sum = 13;
int n = 2;
if (isSubsetSum(set, 3,n, sum) == true)
printf("Found a subset with given sum");
else
printf("No subset with given sum");
return 0;
}
关于C - 不循环地递归查找子集和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22229840/