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

C++ में Target Sum


मान लीजिए हमारे पास गैर-ऋणात्मक पूर्णांकों की एक सूची है, a1, a2, ..., an, और एक अन्य मान, जो लक्ष्य (target) है, S। अब हमारे पास 2 प्रतीक + और - हैं। प्रत्येक पूर्णांक के लिए, हमें + और - में से एक को उसके नए प्रतीक के रूप में चुनना चाहिए। हमें यह पता लगाना है कि पूर्णांकों का योग लक्ष्य मान S के समान बनाने के लिए प्रतीकों को निर्दिष्ट करने के कितने तरीके हैं। इसलिए यदि संख्याएँ [1,1,1,1,1] हैं, और S = 3, तो आउटपुट 5 होगा, क्योंकि संयोजन हैं - 1 + 1 + 1 + 1 + 1 = 3, + 1 - 1 + 1 + 1 + 1 = 3, + 1 + 1 - 1 + 1 + 1 = 3, + 1 + 1 + 1 - 1 + 1 = 3, + 1 + 1 + 1 + 1 - 1 = 3। तो उन्हें निर्दिष्ट करने के पांच तरीके हैं।

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

  • आकार 21 x 2001 की एक तालिका dp बनाएं, इसे -1 से भरें। इसका उपयोग डायनामिक प्रोग्रामिंग दृष्टिकोण के लिए किया जाएगा
  • पुनरावर्ती विधि का उपयोग किया जाएगा जिसे solve() कहा जाता है। यह pos, सरणी v, tempSum और वास्तविक योग S लेगा। यह नीचे की तरह कार्य करेगा -
  • यदि pos सरणी v के आकार के समान है, तो true लौटाएं, यदि s = tempSum, अन्यथा false
  • यदि dp[pos, tempSum + 1000] -1 नहीं है, तो dp[pos, tempSum + 1000] लौटाएं
  • ans := solve(pos + 1, v, tempSum - v[pos], s) + solve(pos + 1, v, tempSum + v[pos], s)
  • dp[pos, tempSum + 1000] = ans
  • ans लौटाएं
  • मुख्य भाग से solve() को पैरामीटर solve(0, nums, 0, s) का उपयोग करके कॉल करें

उदाहरण (C++)

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

#include <bits/stdc++.h> using namespace std; class Solution { public:    int dp[21][2001];    int solve(int pos, vector <int> v, int tempSum, int s){       if(pos == v.size()){          return s == tempSum;       }       if(dp[pos][tempSum+1000]!=-1)return dp[pos][tempSum+1000];       int ans = solve(pos+1,v,tempSum-v[pos],s) +solve(pos+1,v,tempSum+v[pos],s);       dp[pos][tempSum+1000] = ans;       return ans;    }    int findTargetSumWays(vector<int>& nums, int s) {       int n = nums.size();       if(s>1000)return 0;       for(int i =0;i<21;i++){          for(int j =0;j<2001;j++){             dp[i][j] = -1;          }       }       return solve(0,nums,0,s);    } }; main(){    Solution ob;    vector<int> v = {1,1,1,1,1};    cout << ob.findTargetSumWays(v, 3); }

इनपुट

[1,1,1,1,1] 3

आउटपुट

5

  1. - C++ सम एरे पहेली (Sum Array Puzzle)

    एरे (Array) एक डेटा संरचना है जो समान डेटा प्रकार के कई तत्वों को संग्रहीत करती है। यह एक बार में मानों का पूरा सेट संग्रहीत कर सकता है। लेकिन इसकी लंबाई पहले से परिभाषित होनी चाहिए। इस सम एरे पहेली में, हमें एक निश्चित आकार का एरे A1 दिया जाता है, मान लीजिए n। इस पहेली को हल करने के लिए, हम S1 नाम

  1. - C++ में अंकगणितीय माध्य (Arithmetic Mean)

    अंकगणितीय माध्य केवल संख्याओं का औसत है। इस प्रोग्राम में हम देखेंगे कि संख्याओं के एक सेट से अंकगणितीय माध्य कैसे ज्ञात किया जा सकता है। फ़ंक्शन संख्या सेट और तत्वों की संख्या लेगा। हमारा कार्य केवल प्रत्येक तत्व को जोड़ना है, फिर इसे पारित तत्वों की संख्या से विभाजित करना है। एल्गोरिदम arithmetic

  1. - C++ में एलिक्वॉट योग (Aliquot Sum)

    यहां हम देखेंगे कि एलिक्वॉट योग क्या है? n का एलिक्वॉट योग n को छोड़कर n के सभी पूर्ण गुणनखंडों का योग है। उदाहरण के लिए, यदि संख्या 20 है, तो पूर्ण गुणनखंड (1, 2, 4, 5, 10) हैं। तो एलिक्वॉट योग 22 है। एक दिलचस्प तथ्य यह है कि, यदि किसी संख्या का एलिक्वॉट योग संख्या स्वयं है, तो वह संख्या एक पूर्ण