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

लाभदायक योजनाएं C++ में

मान लीजिए G लोगों का एक गिरोह है और विभिन्न अपराधों की एक सूची है जो वे कर सकते हैं। i-वां अपराध profit[i] लाभ उत्पन्न करता है और group[i] गिरोह सदस्यों की भागीदारी की आवश्यकता होती है।

यदि एक गिरोह सदस्य एक अपराध में भाग ले रहा है, तो वह दूसरे अपराध में भाग नहीं ले सकता। अब आइए एक लाभदायक योजना को इन अपराधों के किसी भी उपसमुच्चय के रूप में परिभाषित करें जो कम से कम P लाभ उत्पन्न करता है, और उस उपसमुच्चय में भाग लेने वाले सदस्यों की कुल संख्या अधिकतम G है।

हमें ढूंढना है कि कितनी योजनाएं चुनी जा सकती हैं? उत्तर बहुत बड़ा हो सकता है, इसलिए मॉड्यूलो 10^9 + 7 में वापस करें।

उदाहरण के लिए, यदि G = 5, P = 3 और group = [2,2], profit = [2,3], तो आउटपुट 2 होगा।

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

हम 2D डायनामिक प्रोग्रामिंग का उपयोग करते हैं:

  • dp[g][p] = g सदस्यों का उपयोग करके ठीक p लाभ (कम से कम p पर कैप्ड) प्राप्त करने के तरीकों की संख्या

  • dp[0][0] = 1 से इनिशियलाइज़ करें

  • प्रत्येक अपराध के लिए, dp को पीछे से अपडेट करें ताकि ओवरकाउंटिंग से बचा जा सके

  • संक्रमण: dp[g+group][min(P, p+profit)] += dp[g][p]

  • अंत में, सभी g <= G के लिए dp[g][P] का योग करें

उदाहरण

#include <bits/stdc++.h> 
using namespace std; 
const int m = 1e9 + 7; 

class Solution { 
public: 
    int profitableSchemes(int G, int P, vector<int> &group, vector<int> &profit) { 
        int ret = 0; 
        vector<vector<int>> dp(G + 1, vector<int>(P + 1)); 
        dp[0][0] = 1; 
        
        for (int k = 0; k < group.size(); k++) { 
            int p = profit[k]; 
            int g = group[k]; 
            for (int i = G - g; i >= 0; i--) { 
                for (int j = P; j >= 0; j--) { 
                    dp[i + g][min(P, j + p)] += dp[i][j]; 
                    dp[i + g][min(P, j + p)] %= m; 
                } 
            } 
        } 
        
        for (int i = 0; i <= G; i++) { 
            ret += dp[i][P]; 
            ret %= m; 
        } 
        return ret; 
    } 
}; 

int main(){ 
    Solution ob; 
    vector<int> v = {2,2}, v1 = {2,3}; 
    cout << (ob.profitableSchemes(5,3,v, v1)); 
    return 0;
}

इनपुट

5, 3, [2,2], [2,3]

आउटपुट

2
  1. C++ में प्रोसेस मारें C++ में प्रोसेस मारें

    मान लीजिए हमारे पास n प्रोसेस हैं, यहां प्रत्येक प्रोसेस की एक अद्वितीय आईडी होती है जिसे PID या प्रोसेस आईडी कहा जाता है और इसका PPID (पैरेंट प्रोसेस आईडी) भी होता है। प्रत्येक प्रोसेस का केवल एक पैरेंट प्रोसेस होता है, लेकिन उसके एक या अधिक चाइल्ड प्रोसेस हो सकते हैं। यह एक ट्री संरचना की तरह है।

  1. C++ में गिलहरी सिमुलेशन C++ में गिलहरी सिमुलेशन

    एक पेड़, एक गिलहरी, और कई नट्स हैं। स्थितियों को 2D ग्रिड में सेल द्वारा दर्शाया जाता है। आपका लक्ष्य गिलहरी के लिए सभी नट्स को इकट्ठा करके उन्हें एक-एक करके पेड़ के नीचे रखने के लिए न्यूनतम दूरी ढूंढना है। गिलहरी एक समय में अधिकतम एक नट ले जा सकती है और चार दिशाओं में आगे बढ़ सकती है - ऊपर, नीचे,

  1. C++ में आयत क्षेत्रफल II (Rectangle Area II) - ओवरलैपिंग आयतों का कुल क्षेत्रफल C++ में आयत क्षेत्रफल II (Rectangle Area II) - ओवरलैपिंग आयतों का कुल क्षेत्रफल

    समस्या विवरण हमें अक्ष-संरेखित (axis-aligned) आयतों की एक सूची दी गई है। प्रत्येक आयत rectangle[i] = {x1, y1, x2, y2} द्वारा दर्शाया गया है, जहां (x1, y1) निचले-बाएं कोने का बिंदु है और (x2, y2) ऊपरी-दाएं कोने का बिंदु है। हमें तल (plane) में सभी आयतों द्वारा कवर किए गए कुल क्षेत्रफल को ज्ञात करना