[英]C - recursively finding subset sum without loops
我正在尋求幫助。 我在c中有這段代碼,可以查找是否存在大小為n
的數組set[]
的子集,該子集的sum
為sum
。
例:
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.