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

C++ में k-भागों में समान योग के साथ सूची विभाजन की जांच करने का प्रोग्राम

समस्या विवरण

मान लीजिए हमारे पास nums नामक संख्याओं की एक सूची और एक मान k है, हमें जांचना है कि क्या nums को k अलग-अलग सबसेट में विभाजित करना संभव है जहां प्रत्येक सबसेट का योग समान हो।

उदाहरण के लिए, यदि इनपुट है nums = [4, 2, 6, 5, 1, 6, 3] k = 3, तो आउटपुट True होगा, क्योंकि हम उन्हें इस तरह विभाजित कर सकते हैं: [6, 3], [6, 2, 1], और [4, 5]।

हल करने का दृष्टिकोण

इस समस्या को हल करने के लिए हम बैकट्रैकिंग का उपयोग करेंगे:

  1. एक फंक्शन check() परिभाषित करें जो एक ऐरे v लेता है
    • i := 1 से v के आकार तक: यदि v[i] != v[0], तो false वापस करें
    • true वापस करें
  2. एक फंक्शन dfs() परिभाषित करें जो idx, nums ऐरे, temp ऐरे लेता है
    • यदि idx == nums का आकार, तो check(temp) वापस करें
    • ret := false
    • i := 0 से temp के आकार तक:
      • temp[i] := temp[i] + nums[idx]
      • ret := dfs(idx+1, nums, temp)
      • यदि ret true है, तो true वापस करें
      • temp[i] := temp[i] - nums[idx]
    • false वापस करें
  3. मुख्य विधि से:
    • आकार k का एक ऐरे temp परिभाषित करें
    • dfs(0, nums, temp) वापस करें

उदाहरण

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    bool check(vector<int>& v) {
        for (int i = 1; i < v.size(); i++) {
            if (v[i] != v[0]) return false;
        }
        return true;
    }
    
    bool dfs(int idx, vector<int>& nums, vector<int>& temp) {
        if (idx == nums.size()) {
            return check(temp);
        }
        bool ret = false;
        for (int i = 0; i < temp.size(); i++) {
            temp[i] += nums[idx];
            ret = dfs(idx + 1, nums, temp);
            if (ret) return true;
            temp[i] -= nums[idx];
        }
        return false;
    }
    
    bool solve(vector<int>& nums, int k) {
        vector<int> temp(k);
        return dfs(0, nums, temp);
    }
};

bool solve(vector<int>& nums, int k) {
    return (new Solution())->solve(nums, k);
}

int main() {
    vector<int> v = {4, 2, 6, 5, 1, 6, 3};
    int k = 3;
    cout << solve(v, 3);
}

इनपुट

{4, 2, 6, 5, 1, 6, 3}, 3

आउटपुट

1
  1. - सूची को उन जोड़ों में विभाजित किया जा सकता है या नहीं जांचने का पायथन प्रोग्राम जहां योग k का गुणक हो

    मान लीजिए हमारे पास nums नामक संख्याओं की एक सूची और एक मान k है, हमें जांचना है कि क्या सूची को जोड़ों में विभाजित किया जा सकता है जैसे कि प्रत्येक जोड़ी का योग k से विभाज्य हो। उदाहरण के लिए, यदि इनपुट nums = [4, 7, 2, 5] k = 6 है, तो आउटपुट True होगा, क्योंकि हम दी गई सूची को (4, 2) और (8, 1) जै

  1. - पायथन में जांचें कि क्या हम दो पार्टीशन का ग्रुप बना सकते हैं जिनका योग समान हो

    मान लीजिए हमारे पास nums नामक संख्याओं की एक सूची है, हमें जांचना है कि क्या हम nums को दो ग्रुप में पार्टीशन कर सकते हैं जहां दोनों ग्रुप में तत्वों का योग समान हो। उदाहरण के लिए, यदि इनपुट nums = [2, 3, 6, 5] है, तो आउटपुट True होगा, क्योंकि हम [2, 6] और [3, 5] जैसे ग्रुप बना सकते हैं। इसे हल करन

  1. - पायथन में जांचें कि सूची सख्ती से बढ़ रही है या सख्ती से घट रही है

    मान लीजिए हमारे पास संख्याओं की एक सूची है; हमें जांचना है कि क्या सूची सख्ती से बढ़ रही है या सख्ती से घट रही है। उदाहरण के लिए, यदि इनपुट है nums = [10, 12, 23, 34, 55], तो आउटपुट होगा True, क्योंकि सभी तत्व अलग हैं और प्रत्येक तत्व पिछले से बड़ा है, इसलिए यह सख्ती से बढ़ रहा है। हल करने के चरण