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

C++ में बराबर योग वाले दो सेट्स का अधिकतम योग ढूंढने का प्रोग्राम

समस्या विवरण

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

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

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

इस समस्या को हल करने के लिए हम निम्नलिखित चरणों का पालन करेंगे:

  1. sum := 0
  2. nums में प्रत्येक संख्या i के लिए: sum := sum + i
  3. n := nums का आकार
  4. आकार (n+1) × (2*sum+5) का एक 2D ऐरे dp परिभाषित करें और -1 से भरें
  5. dp[0][sum] := 0
  6. i := 1 से n तक:
    • x := nums[i-1]
    • j := 0 से 2*sum+4 तक:
      • यदि j-x >= 0 और dp[i-1][j-x] != -1, तो dp[i][j] := max(dp[i][j], dp[i-1][j-x] + x)
      • यदि j+x < 2*sum+5 और dp[i-1][j+x] != -1, तो dp[i][j] := max(dp[i][j], dp[i-1][j+x])
      • dp[i][j] := max(dp[i][j], dp[i-1][j])
  7. dp[n][sum] वापस करें

उदाहरण

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

class Solution {
public:
    int solve(vector<int>& nums) {
        int sum = 0;
        for (int i : nums) sum += i;
        int n = nums.size();
        vector<vector<int>> dp(n + 1, vector<int>(2 * sum + 5, -1));
        dp[0][sum] = 0;
        for (int i = 1; i <= n; i++) {
            int x = nums[i - 1];
            for (int j = 0; j < 2 * sum + 5; j++) {
                if (j - x >= 0 && dp[i - 1][j - x] != -1) {
                    dp[i][j] = max(dp[i][j], dp[i - 1][j - x] + x);
                }
                if (j + x < 2 * sum + 5 && dp[i - 1][j + x] != -1) {
                    dp[i][j] = max(dp[i][j], dp[i - 1][j + x]);
                }
                dp[i][j] = max(dp[i][j], dp[i - 1][j]);
            }
        }
        return dp[n][sum];
    }
};

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

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

इनपुट

{2, 5, 4, 6}

आउटपुट

6
  1. - C++ प्रोग्राम: दो अलग-अलग सरणियों में संग्रहीत तत्वों की माध्यिका खोजें

    एल्गोरिदमMedian() फ़ंक्शन में दो सरणी a1[], a2[] और n = तत्वों की संख्या लें। i और j को 0 से प्रारंभ करें, n1 और n2 को -1 से। 0 से n तक लूप चलाएं: यदि i == n तो n1 = n2, n2 = a2[0], लूप तोड़ें। अन्यथा यदि j == n तो n1 = n2, n2 = a1[0], लूप तोड़ें। यदि a1[i] < a2[j] तो n1 = n2, n2 = a1[i], i बढ़ाएं।

  1. - C++ प्रोग्राम: दो संख्याएं जोड़ें

    परिचयजोड़ एक बुनियादी अंकगणितीय संक्रिया है। दो संख्याओं को जोड़ने वाला प्रोग्राम दो संख्याओं का जोड़ करता है और उनका योग स्क्रीन पर प्रिंट करता है। उदाहरण#include <iostream> using namespace std; int main() { int num1 = 15, num2 = 10, sum; sum = num1 + num2; cout << Sum of

  1. - पायथन में दो नॉन-ओवरलैपिंग सबलिस्ट्स का अधिकतम योग खोजने का प्रोग्राम

    मान लीजिए हमारे पास nums नामक संख्याओं की एक सूची और दो मान x और y हैं, हमें nums में दो नॉन-ओवरलैपिंग सबलिस्ट्स का अधिकतम योग ढूंढना है जिनकी लंबाई क्रमशः x और y है।उदाहरण के लिए, यदि इनपुट nums = [3, 2, 10, -2, 7, 6], x = 3, y = 1 है, तो आउटपुट 22 होगा, क्योंकि लंबाई 3 के लिए हम [3, 2, 10] चुनते ह