Czy tablica zawiera elementy, których suma jest równa liczbie podanej na wejściu?

0

A więc tj. w temacie. Chcę napisać funkcję w programie, której deklaracja wygląda tak:

 bool check(int sum,int *table,int size);

Funkcja ma sprawdzać czy w podanej tablicy istnieją takie elementy(taki podciąg spójny lub nie),
których suma jest równa zmiennej sum.
Macie jakieś sugestie,propozycje jak do tego podejść? Jakiego algorytmu użyć?

0

Najszybszy - programowanie dynamiczne.

1

Może coś takiego?:

bool check(int sum, int* v, int size){
	for (int i = 0; i < size; ++i){
		if (v[i] == sum)
			return true;
		else if (v[i] < sum && i < size)
			if (check(sum - v[i], &v[i + 1], size - i - 1))
				return true;
	}

	return false;
}

Sam również jestem początkujący, więc jestem ciekawe czy można byłoby to zrobić lepiej.

0

Ale to jest przeciez problem NP-zupełny.
http://en.wikipedia.org/wiki/Subset_sum_problem

1

Pisane z palca, bez jakichkolwiek testów:

bool checkP(int targetSum, int currentSum, int * v, int size) {
  if (size > 0) {
    return check(targetSum, currentSum, v + 1, size - 1)
      || check(targetSum, currentSum + *v, v + 1, size - 1);
  } else {
    return targetSum == currentSum;
  }
}

bool check(int sum, int * v, int size) {
  return checkP(sum, 0, v, size);
}

Lub po lekkich poprawkach kosmetycznych:

bool check(int targetSum, int * v, int size, int currentSum = 0) {
  return size > 0 ? check(targetSum, v + 1, size - 1, currentSum)
    || check(targetSum, v + 1, size - 1, currentSum + *v) 
    : targetSum == currentSum;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1