यहां हम एक समस्या देखेंगे। मान लीजिए एक सरणी arr दी गई है। हमें जांचना है कि क्या सरणी को दो भागों में विभाजित किया जा सकता है, जैसे कि:
- दोनों सब-एरेज का योग समान होगा
- सभी एलिमेंट्स जो 5 के गुणक हैं, एक ही समूह में होंगे
- सभी एलिमेंट्स जो 3 के गुणक हैं लेकिन 5 के नहीं, एक ही समूह में होंगे
- बाकी सभी एलिमेंट्स अन्य समूहों में होंगे।
मान लीजिए सरणी के एलिमेंट्स {1, 4, 3} हैं, तो इसे विभाजित किया जा सकता है, क्योंकि {1, 3} का योग {4} के योग के समान है, और समूह भी दी गई शर्त के लिए सही हैं।
एल्गोरिदम
isSplitArray(arr, n, start, left_sum, right_sum) −
शुरुआत यदि start = n, तो true वापस करें जब left_sum = right_sum, अन्यथा false यदि arr[start] 5 से विभाज्य है, तो arr[start] को left_sum में जोड़ें अन्यथा यदि arr[start] 3 से विभाज्य है, तो arr[start] को right_sum में जोड़ें अन्यथा isSplitArray(arr, n, start + 1, left_sum + arr[start], right_sum) OR isSplitArray(arr, n, start + 1, left_sum, right_sum + arr[start]) वापस करें isSplitArray(arr, n, start + 1, left_sum, right_sum) वापस करें समाप्त
उदाहरण
#include <iostream> using namespace std; bool isSplitArray(int* arr, int n, int start, int left_sum, int right_sum) { if (start == n) //जब यह अंत तक पहुंच जाता है return left_sum == right_sum; if (arr[start] % 5 == 0) //जब एलिमेंट 5 से विभाज्य है, left sum में जोड़ें left_sum += arr[start]; else if (arr[start] % 3 == 0) //जब एलिमेंट 3 से विभाज्य है लेकिन 5 से नहीं, right sum में जोड़ें right_sum += arr[start]; अन्यथा // अन्यथा इसे किसी भी सब-एरे में जोड़ा जा सकता है return isSplitArray(arr, n, start + 1, left_sum + arr[start], right_sum) || isSplitArray(arr, n, start + 1, left_sum, right_sum + arr[start]); // उन मामलों के लिए जब एलिमेंट 3 या 5 का गुणक है। return isSplitArray(arr, n, start + 1, left_sum, right_sum); } int main() { int arr[] = {1, 4, 3}; int n = sizeof(arr)/sizeof(arr[0]); if(isSplitArray(arr, n, 0, 0, 0)){ cout <<"विभाजित किया जा सकता है"; } else { cout <<"विभाजित नहीं किया जा सकता"; } } आउटपुट
विभाजित किया जा सकता है