Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 파티션 문제

<시간/>

이 문제에서는 배열이 두 개의 동일한 하위 배열로 분할될 수 있는지 여부를 결정하기 위해 C++ 코드를 작성해야 합니다. 또한 두 하위 배열의 모든 요소의 합이 정확히 동일한지 여부를 조건을 확인해야 합니다. 파티셔닝 문제는 부분집합 문제의 변형이며, 이는 다시 배낭 문제의 변형입니다. 파티션 문제를 해결하기 위해 C++ 프로그래밍 언어를 사용할 것입니다. 지정된 조건이 충족되었는지 여부에 따라 Yes 또는 No가 포함된 문자열을 반환해야 합니다.

입력

arr[] = {6, 4, 8, 12, 15}

출력

Is possible to divide into two subsets of equal sum

문제 해결을 위한 접근

목표는 집합에 있는 모든 요소의 합을 찾는 것입니다. 배열 합계가 홀수이면 두 세트로 나눌 수 없습니다. 합계가 짝수일 때 sum/2로 부분 집합을 식별합니다. 주어진 배열을 사용하여 각 요소를 하나씩 조사한 후 다음 항목 중 하나를 선택하십시오.

  • 하위 집합에 현재 항목을 계속 포함하고 나머지를 추가하여 합계에 도달합니다.

  • 현재 항목이 하위 집합에서 제거되면 다른 항목에 대해 프로세스를 반복합니다.

마지막으로 현재 항목이 하위 집합에 포함되거나 제외되면 true를 반환합니다. 그렇지 않으면 false를 반환합니다. 더 이상 항목이 없거나 합계가 음수가 되면 재귀가 종료됩니다. 합계가 0인 경우 하위 집합이 식별되었음을 의미하는 true를 반환합니다.

#include <bits/stdc++.h>
using namespace std;
bool isSubsetSum(int arr[], int n, int sum) {
   if (sum == 0)
      return true;
   if (n == 0 && sum != 0)
      return false;
   if (arr[n - 1] > sum)
      return isSubsetSum(arr, n - 1, sum);
   return isSubsetSum(arr, n - 1, sum) ||
   isSubsetSum(arr, n - 1, sum - arr[n - 1]);
}
bool findPartiion(int arr[], int n) {
   int sum = 0;
   for (int i = 0; i < n; i++)
      sum += arr[i];
   if (sum % 2 != 0)
      return false;
   return isSubsetSum(arr, n, sum / 2);
}
int main() {
   int arr[] = {
      6,
      4,
      8,
      12,
      15
   };
   int n = sizeof(arr) / sizeof(arr[0]);
   if (findPartiion(arr, n) == true)
      cout << "Is possible to divide into two subsets " "of equal sum";
   else
      cout << "Is impossible to divide into two subsets" " of equal sum";
   return 0;
}

출력

Is impossible to divide into two subsets of equal sum

접근법 2

구성 요소의 합계가 너무 크지 않으면 동적 프로그래밍을 사용하여 문제를 처리할 수 있습니다. (sum/2 + 1)*(n+1) 크기의 2D 배열 부분[][]을 생성할 수 있습니다. 채워진 각 항목이 다음 속성을 갖도록 아래에서 위로 솔루션을 빌드할 수도 있습니다. (sum/2 + 1)*(n + 1) 크기의 2차원 배열.

#include <bits/stdc++.h>
using namespace std;
bool findPartiion(int arr[], int n) {
   int sum = 0;
   int i, j;
   for (i = 0; i < n; i++)
      sum += arr[i];
   if (sum % 2 != 0)
      return false;
   bool part[sum / 2 + 1];
   for (i = 0; i <= sum / 2; i++) {
      part[i] = 0;
   }
   for (i = 0; i < n; i++) {
      for (j = sum / 2; j >= arr[i]; j--){
         if (part[j - arr[i]] == 1 || j == arr[i])
            part[j] = 1;
      }
   }
   return part[sum / 2];
}
int main() {
   int arr[] = {
      6,
      4,
      8,
      12,
      15
   };
   int n = sizeof(arr) / sizeof(arr[0]);
   if (findPartiion(arr, n) == true)
      cout << "Is possible to divide into two subsets of equal " "sum";
   else
      cout << "Is impossible to divide into two subsets" " of equal sum";
   return 0;
}

출력

Is impossible to divide into two subsets of equal sum

결론

이번 문제에서는 C++ 코드와 함께 파티션 문제를 해결하는 방법을 배웠습니다. 이 코드는 Java, python 및 기타 언어로도 작성할 수 있습니다. C++ 프로그래밍 언어에서 재귀 배열을 사용하여 파티션 문제를 해결했습니다. 기본적인 코드지만 문제 해결에 여러 용도가 있습니다.