簡體   English   中英

C-遞歸查找無循環的子集總和

[英]C - recursively finding subset sum without loops

我正在尋求幫助。 我在c中有這段代碼,可以查找是否存在大小為n的數組set[]的子集,該子集的sumsum

例:

 set[] = {1,2,3};
 n = 2;
 sum = 4;

上面的代碼將返回true,因為size-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]);
}

您會混淆集合的大小和子集的大小。 n設計全套的大小,讓k設計子集的大小。 然后:

#include <stdio.h>
bool isSubsetSum(int set[], int n, int k, int sum)
{
  // Base Cases
  if (sum == 0 && k == 0)
    return true;
  if (n == 0)       // fixed base case. 
    return false;

  if (set[n-1] > sum)
    return isSubsetSum(set, n-1, k, sum);

  return isSubsetSum(set, n-1, k, sum) || isSubsetSum(set, n-1, k-1, sum-set[n-1]);
}

int main()
{
  int set[] = {6,5,6};
  int sum = 12;
  int n = 3;
  int k = 2;
  if (isSubsetSum(set, n, k, sum))
    printf("Found a subset with given sum\n");
  else
    printf("No subset with given sum\n");
  return 0;
}

您還需要將集合的大小作為參數傳遞。 以下代碼有效。

#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;
}

在列表的末尾使用0表示設置的長度。

#include <stdio.h>
#include <stdbool.h>

bool isSubsetSum(int set[], int n, int sum) {
  if (n == 0)
    return sum == 0;
  if (set[0] == 0)  // End of the line
    return false;
  if (isSubsetSum(set + 1, n, sum)) // Do not use first element
    return true;
  if (isSubsetSum(set + 1, n - 1, sum - set[0])) // Use first element
    return true;
  return false;
}

// Driver program to test above function
int main() {
  int set[] = { 6, 5, 6, 0 };
  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;
}

這也適用於負數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM