मान लीजिए कि हमारे पास संख्याओं की एक सूची है, जिसे अंक कहा जाता है, अब दो सेट खोजें क्योंकि उनके योग समान और अधिकतम हैं, तो योग मान ज्ञात करें।
इसलिए, यदि इनपुट संख्या =[2, 5, 4, 6] की तरह है, तो आउटपुट 6 होगा, क्योंकि सेट [2, 4] और [6] हैं।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- योग :=0
- प्रत्येक संख्या के लिए i अंकों में, करें
- योग :=योग + मैं
- n :=अंकों का आकार
- एक 2डी सरणी डीपी आकार (n + 1) x (2 * योग + 5) परिभाषित करें और -1 से भरें
- dp[0, sum] :=0
- इनिशियलाइज़ i :=1 के लिए, जब i <=n, अपडेट करें (i को 1 से बढ़ाएँ), −
- करें
- x :=nums[i - 1]
- इनिशियलाइज़ j :=0 के लिए, जब j <2 * sum + 5, अपडेट करें (j को 1 से बढ़ाएँ), करें -
- यदि j - x>=0 और dp[i - 1, j - x] -1 के बराबर नहीं है, तो ^−
- dp[i, j] :=अधिकतम dp[i, j] और (dp[i - 1, j - x] + x)
- यदि j + x <(2 * योग + 5) और dp[i - 1, j + x] -1 के बराबर नहीं है, तो −
- dp[i, j] :=अधिकतम dp[i, j] और (dp[i - 1, j + x])
- dp[i, j] :=अधिकतम dp[i, j] और dp[i-1, j]
- यदि j - x>=0 और dp[i - 1, j - x] -1 के बराबर नहीं है, तो ^−
- रिटर्न डीपी[एन, योग]
उदाहरण (C++)
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#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);
}
main(){
vector<int> v = {2, 5, 4, 6};
cout << solve(v);
} इनपुट
{2, 5, 4, 6} आउटपुट
6