Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> प्रोग्रामिंग

विभाजन की समस्या


इस समस्या के लिए, किसी दिए गए समुच्चय को इस प्रकार विभाजित किया जा सकता है, कि प्रत्येक उपसमुच्चय का योग बराबर हो।

सबसे पहले हमें दिए गए समुच्चय का योग ज्ञात करना है। यदि यह सम है, तो इसे दो सेटों में विभाजित करने का मौका है। अन्यथा, इसे विभाजित नहीं किया जा सकता।

योग के सम मान के लिए, हम partTable नाम की एक तालिका बनाएंगे, अब समस्या को हल करने के लिए निम्न शर्त का उपयोग करें।

partTable[i, j] सत्य है, जब array[0] से array[j-1] के उपसमुच्चय का योग i के बराबर है, अन्यथा यह गलत है।

इनपुट और आउटपुट

Input:
A set of integers. {3, 1, 1, 2, 2, 1}
Output:
True if the set can be partitioned into two parts with equal sum.
Here the answer is true. One pair of the partitions are: {3, 1, 1}, {2, 2, 1}

एल्गोरिदम

checkPartition(set, n)

इनपुट - दिया गया सेट, सेट में तत्वों की संख्या।

आउटपुट - सही है जब समान योग के दो उपसमुच्चय बनाना संभव है।

Begin
   sum := sum of all elements in the set
   if sum is odd, then
      return

   define partTable of order (sum/2 + 1 x n+1)
   set all elements in the 0th row to true
   set all elements in the 0th column to false

   for i in range 1 to sum/2, do
      for j in range 1 to n, do
         partTab[i, j] := partTab[i, j-1]
         if i >= set[j-1], then
            partTab[i, j] := partTab[i, j] or with
            partTab[i – set[j-1], j-1]
      done
   done

   return partTab[sum/2, n]
End

उदाहरण

#include <iostream>
using namespace std;

bool checkPartition (int set[], int n) {
   int sum = 0;

   for (int i = 0; i < n; i++)    //find the sum of all elements of set
      sum += set[i];

   if (sum%2 != 0)     //when sum is odd, it is not divisible into two set
      return false;

   bool partTab[sum/2+1][n+1];    //create partition table
   for (int i = 0; i <= n; i++)
      partTab[0][i] = true;    //for set of zero element, all values are true

   for (int i = 1; i <= sum/2; i++)
      partTab[i][0] = false;    //as first column holds empty set, it is false

   // Fill the partition table in botton up manner
   for (int i = 1; i <= sum/2; i++)  {
      for (int j = 1; j <= n; j++)  {
         partTab[i][j] = partTab[i][j-1];
         if (i >= set[j-1])
            partTab[i][j] = partTab[i][j] || partTab[i - set[j-1]][j-1];
      }      
   }  
   return partTab[sum/2][n];
}
   
int main() {
   int set[] = {3, 1, 1, 2, 2, 1};
   int n = 6;

   if (checkPartition(set, n))
      cout << "Given Set can be divided into two subsets of equal sum.";
   else
      cout << "Given Set can not be divided into two subsets of equal sum.";
} 

आउटपुट

Given Set can be divided into two subsets of equal sum.

  1. सबसे बड़ी स्वतंत्र सेट समस्या

    स्वतंत्र सेट सभी बाइनरी ट्री नोड्स का सबसेट है जब उस सबसेट में किन्हीं दो नोड्स के बीच कोई किनारा नहीं होता है। अब तत्वों के समुच्चय से हम सबसे लंबा स्वतंत्र समुच्चय प्राप्त करेंगे। यानी यदि तत्वों का उपयोग बाइनरी ट्री बनाने के लिए किया जाता है, तो सभी सबसे बड़े उपसमुच्चय, जहां उस उपसमुच्चय में को

  1. वर्टेक्स कवर समस्या

    अप्रत्यक्ष ग्राफ़ के लिए, शीर्ष आवरण शीर्षों का एक उपसमुच्चय होता है, जहां ग्राफ़ के प्रत्येक किनारे (u, v) के लिए या तो u या v सेट में होता है। बाइनरी ट्री का उपयोग करके, हम आसानी से वर्टेक्स कवर की समस्या को हल कर सकते हैं। इस समस्या को दो उप-समस्याओं में विभाजित किया जा सकता है। जब जड़ शीर्ष आव

  1. C++ में एक सेट को k सबसेट में विभाजित करने के तरीकों की संख्या की गणना करें

    दो अंक e और p दिए गए हैं। लक्ष्य उन तरीकों की संख्या गिनना है जिनसे हम एक सेट के e तत्वों को p विभाजन/सबसेट में विभाजित कर सकते हैं। उदाहरण के लिए इनपुट e=4 p=2 आउटपुट Count of number of ways to partition a set into k subsets are: 7 स्पष्टीकरण If elements are: a b c d then ways to divide them into