हमें दो पूर्णांक सरणियाँ दी गई हैं, एक में तत्वों की गणना की गई है और दूसरे में विभाजित बिंदु हैं जो सबसेट बनाने के लिए सरणी को विभाजित करने के लिए आवश्यक हैं और हमें प्रत्येक विभाजन में प्रत्येक उपसमुच्चय के योग की गणना करनी होगी और अधिकतम सबसेट योग वापस करना होगा।पी>
उदाहरण के साथ समझते हैं:-
इनपुट - int arr[] =int arr[] ={ 9, 4, 5, 6, 7 } int splitPoints[] ={ 0, 2, 3, 1};
आउटपुट - प्रत्येक विभाजन के बाद अधिकतम उपसरणी योग [22, 13, 9, 9]
स्पष्टीकरण - यहां हम सरणी को उनके विभाजन बिंदुओं के अनुसार तोड़ रहे हैं और प्रत्येक विभाजन के बाद अधिकतम सबसेट योग प्राप्त कर रहे हैं
पहले विभाजन के बाद → {9} और {4,5,6,7}>> अधिकतम सबअरे योग है- 22
दूसरे विभाजन के बाद → {9}, {4,5} और {6,7}>> अधिकतम सबअरे योग है- 13
तीसरे विभाजन के बाद →{9}, {4,5}, {6} और {7}>> अधिकतम सबअरे योग है- 9
चौथे विभाजन के बाद →{9}, {4}, {5}, {6} और {7}>> अधिकतम सबअरे योग है- 9
इनपुट −int arr[] =int arr[] ={ 7, 8, 5, 9, 1 } int splitPoints[] ={ 1, 2, 0, 3};
आउटपुट −प्रत्येक विभाजन के बाद अधिकतम सबअरे योग [15, 115, 10, 9]
स्पष्टीकरण −यहां हम सरणी को उनके विभाजन बिंदुओं के अनुसार तोड़ रहे हैं और प्रत्येक विभाजन के बाद अधिकतम सबसेट योग प्राप्त कर रहे हैं
पहले विभाजन के बाद → {7,8} और {5,9,1}>> अधिकतम सबअरे योग 15
. हैदूसरे विभाजन के बाद → {7,8}, {5} और {9,1}>> अधिकतम सबअरे योग 115
. हैतीसरे विभाजन के बाद →{7}, {8}, {5} और {9,1}>> अधिकतम सबअरे योग 10
हैचौथे विभाजन के बाद →{7}, {8}, {5}, {9} और {1}>> अधिकतम सबअरे योग 9
हैनीचे दिए गए प्रोग्राम में इस्तेमाल किया गया तरीका इस प्रकार है -
-
हम मुख्य () विधि से शुरू करेंगे
-
किसी भी लंबाई के इनपुट सरणियाँ मान लें, एआर [] और स्प्लिटपॉइंट्स []। उनकी लंबाई की गणना करें और गणना के रूप में विधि को पास करेंSubsetSum(arr.length, splitPoints.length, splitPoints, arr)।
-
-
मेथड के अंदर कैलकुलेटसबसेटसम ()
-
योग [] के रूप में एक पूर्णांक सरणी बनाएं और योग [0] को गिरफ्तारी [0] के रूप में सेट करें।
-
एक सरणी की लंबाई तक i से 1 तक के लिए लूप प्रारंभ करें और योग [i] से योग [i - 1] + arr [i] सेट करें और अस्थायी [0] को नए उपसमूहों में सेट करें (0, n - 1, योग [n - 1])।
-
t2.add(temp[0]) और t1.add(0)
. जोड़ते रहें -
स्प्लिटपॉइंट्स सरणी की लंबाई तक i से 0 तक के लिए लूप प्रारंभ करें। लूप के अंदर currentSplitPoint को t1.floor(splitPoints[i]) पर सेट करें और t2 से t2.remove(temp[currentSplitPoint])
के रूप में निकालें -
अंत को अस्थायी [currentSplitPoint] के रूप में सेट करें। अंतिम और अस्थायी [currentSplitPoint] को नए उपसमूहों के रूप में सेट करें (currentSplitPoint, विभाजन बिंदु [i], योग [विभाजन बिंदु [i]] - (currentSplitPoint ==0? 0:योग [currentSplitPoint - 1]))पी>
-
t2.add(temp[currentSplitPoint]) और temp[splitPoints[i] + 1] =new subSets(splitPoints[i] + 1, end, sum[end] - sum[splitPoints[i]])
-
t2.add(temp[splitPoints[i] + 1]), t1.add(currentSplitPoint) और t1.add(splitPoints[i] + 1)
का उपयोग करके जोड़ें -
t2.first() मान प्रिंट करें।
-
-
क्लास सबसेट के रूप में एक क्लास बनाएं और इसके डेटा सदस्यों के रूप में प्रथम, अंतिम और मान घोषित करें और डिफ़ॉल्ट कंस्ट्रक्टर को सबसेट्स (int f, int l, int v) के रूप में परिभाषित करें और पहले f पर सेट करें, अंतिम से l और मान v
-
उपयोगिता तुलनाकर्ता के रूप में एक वर्ग बनाएं जो तुलनित्र को लागू करेगा
-
तुलना के रूप में एक सार्वजनिक विधि बनाएं और जांचें कि यदि s2.value s1.value के बराबर नहीं है तो s2.value - s1.value लौटाएं।
-
जांचें कि क्या s1.first s2 के बराबर नहीं है। पहले तो s2.first - s1.first लौटाएं
-
उदाहरण
आयात करें s1.value){ वापसी s2.value - s1.value; } if(s1.first !=s2.first){ वापसी s2.first - s1.first; } वापसी 0; }}वर्ग उपसमूह{ int पहले; इंट लास्ट; इंट वैल्यू; सबसेट्स (इंट एफ, इंट एल, इंट वी) {प्रथम =एफ; अंतिम =एल; मूल्य =वी; }}पब्लिक क्लास टेस्टक्लास{ स्टेटिक शून्य कैलकुलेटसबसेटसम (इंट एन, इंट के, इंट स्प्लिटपॉइंट्स [], इंट एआर []) {इंट योग [] =नया इंट [एन]; योग [0] =गिरफ्तारी [0]; के लिए (int i =1; iआउटपुट
यदि हम उपरोक्त कोड चलाते हैं तो यह निम्न आउटपुट उत्पन्न करेगा
प्रत्येक विभाजन के बाद अधिकतम सबअरे योग494949494434