2012-06-28 5 views
-1
나는 부분 집합의 합에 대한 알고리즘을 구현하고

:부분적인 합계 구현

SUBSET SUM(X[1 .. n], T): 
if T = 0 
return T RUE 
else if T < 0 or n = 0 
return FALSE 
else 
return SUBSET SUM(X[2 .. n], T) ∨ SUBSET SUM(X[2 .. n], T − X[1]) 

내가 감소 배열 X를 전달할 수있는 방법으로 저를 도와주세요 [2 ... n이] 재귀?

이 내가 쓴 코드는 그것이 세그먼트 오류가 발생합니다 : 함수의 인수로 사용될 때 암시 적으로 배열을 나타내는 원래의 메모리 버퍼에 대한 포인터로 붕괴되는 C/C++에서

#include <stdio.h> 

    int subsetsum(int a[], int sum, int size) 
    { 
      if(sum==0) 
      return 1; 
      else if (sum<0 || size <0) 
      return 0; 
      else 
      return (subsetsum(a+1 , sum, size-1) || subsetsum(a+1, sum - *a, size-1)); 
    } 
    ` 

    int main(int argc, char **argv) 
    { 
      int a[]={2,4,1,3,5},x; 
      x=subsetsum(a,6,5); 
      printf("%d",x); 
      return 0; 
    } 
+0

지금까지 쓴 정확하게 당신에게 붙어 어디에있는 코드를 제시해주십시오. – jrok

+0

코드는 다음과 같습니다. http://pastebin.com/mxg97e4x 세그먼트 화 오류가 발생합니다. – hashinclude

+2

C 또는 C++. 고르다. 결정. 프로스퍼. – rubenvb

답변

1

배열의합니다. 따라서 X[2...n]을 전달하려면 배열 포인터 인수를 1만큼 증가시킬 수 있습니다. 예를 들어, 다음과 같이 할 수있는 :

bool subset_sum(const int* array, const int array_size, int* sum) 
{ 
    //...your code for the rest of the algorithm 

    subset_sum(array+1, array_size, sum) //one of the recursive calls 
} 

하나를 사용하여 배열 포인터를 증가하고, 배열을 가리키는 포인터를 취할 것 다음 재귀 호출에 인수 array+1 전달을 X[1...n] 지금은 가리 만들기 배열 X[2...n]. array_size 인수를 사용하여 배열의 끝을 감지합니다.

마지막으로, 당신과 같이 subset_sum를 부를 것이다 :

int array_numbers = {1, 2, 3, 4, 5, 6, 7}; 
int sum = 0; 

subset_sum(array_numbers, sizeof(array_numbers)/sizeof(int), &sum); 
+0

이 코드를 작성했습니다 : - http://pastebin.com/mxg97e4x 세그먼트 화 오류가 발생합니다. – hashinclude

+0

'else if (합계 <0 || 크기 <0)'을'else if (합계 <0 || 크기 == 0) '로 변경하십시오. – Jason

+0

좋습니다. 감사. 내 코드가 지금 작동 중이다. 여기있다 : - http://pastebin.com/hevSX8mr – hashinclude

2
template<class It> 
void recurse(It begin, It end) 
{ 
    ... recurse(begin+1, end) ... 
}