C - 不循环地递归查找子集和

标签 c recursion subset

我正在寻求帮助。我在 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/

相关文章:

r - R 数据框中的条件行删除

python - 来自 Python : sub. stdin.write IOError Broken Pipe 的 C 子进程

c - 如何避免在 makefile 中手动列出来自不同路径的每个 C 文件?

assembly - 递归除法汇编程序

c# - 递归对象树的最简单方法

javascript - 如何使用javascript将两个数组的子集放入不同的数组中?

c++ - Mac OS X 的 OpenGL 红皮书

c - 如何打印函数返回的数组

javascript - Eloquent Javascript - ch4 - arraytoList - 递归

f# - 从 F# 中的集合中获取随机子集