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

C++ में K समान सम सबसेट का विभाजन


मान लीजिए कि हमारे पास पूर्णांकों की एक सरणी है जिसे अंक और एक धनात्मक पूर्णांक k कहा जाता है, जाँच करें कि क्या इस सरणी को k गैर-रिक्त उपसमुच्चय में विभाजित करना संभव है, जिनके योग समान हैं। तो अगर सरणी [4,3,2,3,5,2,1] और k =4 की तरह है, तो परिणाम सही होगा, क्योंकि दिए गए सरणी को चार उप-सरणी में विभाजित किया जा सकता है जैसे [[5], [ 1,4], [2,3], [2,3]] बराबर राशि के साथ।

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

  • dp नामक दो तालिका परिभाषित करें और कुल आकार 2^n,
  • दिए गए सरणी संख्याओं को क्रमबद्ध करें, योग सेट करें:=अंक सरणी में सभी तत्वों का योग
  • यदि योग mod k गैर 0 है या अंकों का अंतिम तत्व है> योग / k, तो झूठी वापसी करें
  • सेट dp[0] :=true and sum :=sum / k
  • मैं के लिए 0 से 2^n की सीमा में
    • यदि dp[i] शून्य नहीं है, तो
      • जे के लिए 0 से ,
          . की सीमा में
        • अस्थायी:=मैं या 2 ^ जे
        • अगर टेम्परेचर i के समान नहीं है, तो
          • यदि अंक [जे] <=योग - कुल [i] मॉड योग, तो डीपी [अस्थायी]:=सत्य
          • कुल [अस्थायी] :=कुल[i] + अंक [j]
        • अन्यथा लूप से बाहर आएं
  • रिटर्न डीपी[(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 सबसेट में विभाजित करने के तरीकों की संख्या की गणना करें

    दो अंक 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

  1. सी++ में पथ योग IV

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

  1. C++ में समान वृक्ष विभाजन

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