मान लीजिए कि हमारे पास एक सरणी ए है, हमें ए के प्रत्येक तत्व को सूची बी या सूची सी में ले जाना चाहिए। (ये सूचियां बी और सी शुरू में खाली हैं।) हमें यह जांचना है कि इस तरह की चाल के बाद, यह संभव है कि औसत मूल्य B का, C के औसत मान के बराबर है, और B और C दोनों खाली नहीं हैं।
तो अगर इनपुट इस तरह है - [1,2,3,4,5,6,7,8,9,10], तो परिणाम सही होगा,
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- n:=A का आकार, कुल:=0
- इनिशियलाइज़ i :=0 के लिए, जब i
करें - कुल :=कुल + A[i]
- यदि कुल * i mod n 0 के समान है, तो −
- संभव है:=सत्य
- झूठी वापसी
- करें
- इनिशियलाइज़ l :=1 के लिए, जब l <=(n / 2), अपडेट करें (l को 1 से बढ़ाएँ), करें −
- dp[j, l] :=dp[j, l] या dp[j - x, l - 1]
- करें
- यदि (कुल * i) mod n 0 के समान है और dp[total * i / n, i] गैर-शून्य है, तो −
- सही लौटें
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; class Solution { public: bool splitArraySameAverage(vector<int>& A) { int n = A.size(); int total = 0 ; for(int i = 0; i < n; i++) total += A[i]; bool isPossible = false; int m = n / 2; for (int i = 1; i <= m && !isPossible; ++i) if (total*i%n == 0) isPossible = true; if (!isPossible) return false; vector < vector <bool> > dp(total + 1, vector <bool>((n / 2) + 1)); dp[0][0] = true; for(int i = 0; i < n; i++){ int x = A[i]; for(int j = total; j >= x; j--){ for(int l = 1; l <= (n / 2); l++){ dp[j][l] = dp[j][l] || dp[j - x][l - 1]; } } } for(int i = 1 ; i <= (n / 2); i++){ if((total * i) % n == 0 && dp[total * i / n][i]) return true; } return false; } }; main(){ Solution ob; vector<int> v = {1,2,3,4,5,6,7,8,9,10}; cout << (ob.splitArraySameAverage(v)); }
इनपुट
{1,2,3,4,5,6,7,8,9,10}
आउटपुट
1