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

C++ में Partition to K Equal Sum Subsets



मान लीजिए हमारे पास nums नामक एक पूर्णांक सरणी और एक धनात्मक पूर्णांक k है, जांचें कि क्या इस सरणी को k गैर-खाली उपसमुच्चयों (subsets) में विभाजित करना संभव है जिनके योग सभी समान हैं। इसलिए यदि सरणी [4,3,2,3,5,2,1] जैसी है और k = 4, तो परिणाम True होगा, क्योंकि दी गई सरणी को चार उपसरणियों जैसे [[5], [1,4], [2,3], [2,3]] में विभाजित किया जा सकता है जिनके योग समान हैं।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • dp और total नामक दो तालिकाएँ परिभाषित करें जिनका आकार 2^n हो,
  • दी गई सरणी nums को क्रमबद्ध करें, sum := nums सरणी में सभी तत्वों का योग सेट करें
  • यदि sum mod k शून्येतर है OR nums का अंतिम तत्व > sum / k है, तो false लौटाएं
  • dp[0] := true सेट करें और sum := sum / k
  • i को 0 से 2^n तक की रेंज में
    • यदि dp[i] शून्येतर है, तो
      • j को 0 से तक की रेंज में
        • temp := i OR 2 ^ j
        • यदि temp i के समान नहीं है, तो
          • यदि nums[j] <= sum - total[i] mod sum, तो dp[temp] := true
          • total[temp] := total[i] + nums[j]
        • अन्यथा लूप से बाहर आएं
  • dp[(2^n) - 1] लौटाएं

उदाहरण (C++)

बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें -

#include <bits/stdc++.h> using namespace std; class Solution { public:    bool canPartitionKSubsets(vector<int>& nums, int k) {       int n = nums.size();       vector <bool> dp(1 << n);       vector <int> total(1 << n);       sort(nums.begin(), nums.end());       int sum = 0;       for(int i = 0; i < nums.size(); i++)sum += nums[i];       if(sum % k || nums[nums.size() - 1] > sum / k) return false;       dp[0] = true;       sum /= k;       for(int i = 0; i < (1 << n); i++){          if(dp[i]){             for(int j = 0; j < n; j++){                int temp = i | (1 << j);                if(temp != i){                   if(nums[j] <= sum - (total[i] % sum)){                      dp[temp] = true;                      total[temp] = total[i] + nums[j];                   }                   else{                      break;                   }                }             }          }       }       return dp[(1 << n) - 1];    } }; main(){    Solution ob;    vector<int> v = {4,3,2,3,5,2,1};    cout << (ob.canPartitionKSubsets(v, 4)); }

इनपुट

[4,3,2,3,5,2,1] 4

आउटपुट

1

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

    समस्या विवरण दो संख्याएं e और p दी गई हैं। लक्ष्य उन तरीकों की संख्या गिनना है जिनसे हम एक सेट के e तत्वों को p पार्टीशन/उपसमुच्चयों में विभाजित कर सकते हैं। उदाहरण इनपुट e=4 p=2 आउटपुट सेट को k उपसमुच्चयों में विभाजित करने के तरीकों की संख्या: 7 व्याख्या यदि तत्व हैं: a b c d तो उन्हें 2 पार्टीशन

  1. - C++ में पथ योग IV

    मान लीजिए हमारे पास पूर्णांकों की एक सूची है जो गहराई 5 से कम वाले बाइनरी ट्री को दर्शाती है। यदि ट्री की गहराई 5 से कम है, तो इस ट्री को तीन अंकों वाले पूर्णांकों की सूची द्वारा दर्शाया जा सकता है। इस सूची में प्रत्येक पूर्णांक के लिए: सैकड़ों अंक इस नोड की गहराई D को दर्शाता है, 1 <= D <= 4। दहा

  1. C++ में समान ट्री विभाजन C++ में समान ट्री विभाजन

    मान लीजिए हमारे पास n नोड्स वाला एक बाइनरी ट्री है, हमारा कार्य यह जांचना है कि क्या मूल ट्री पर ठीक एक किनारा हटाकर ट्री को दो ट्री में विभाजित करना संभव है जिनके मानों का योग समान हो। उदाहरण के लिए, यदि इनपुट दिए गए चित्र के अनुसार है, तो आउटपुट true होगा। हल करने की विधि हम पोस्ट-ऑर्डर ट्रैवर्सल