Find subset with maximum sum under given condition - GeeksforGeeks

03 Jun, 2021
Given values[] and labels[] of n items and a positive integer limit, We need to choose a subset of these items in such a way that the number of the same type of label in the subset should be <= limit and sum of values are maximum among all possible subset choices.
Examples:  
Input: values[] = [5, 3, 7, 1, 2],
       labels[] = [5, 7, 7, 7, 6],
       limit = 2
Output: 17
Explanation:
You can select first, second, third 
and Fifth values.
So, there is 1 value of the label 5 -> {5},
    2 value of the label 7 -> {3, 7} ,
    1 value of the label 6 -> {2}.
Final subset = {5, 3, 7, 2}
Sum  = 5 + 3 + 7 + 2 = 17.

Input: values[] = [9, 8, 7, 6, 5],
       labels[] = [5, 7, 7, 7, 6],
       limit = 2
Output: 29
Approach: The idea is to use a Multimap and Hashmap to solve this problem. 
We will store all the values and the respective labels as a pair in the Multimap.
In Multimap the {values, labels} pairs are sorted in increasing order. So, we will traverse the Multimap in reverse to get the pairs in decreasing order.
Now, we will add the values in our answer and store the occurrence of each label in Hashmap to check if the number of occurrences is <= limit.
Below is the implementation of the above approach:
C++
Python3
Javascript
// C++ program to Find subset with// maximum sum under given condition.#include <bits/stdc++.h>using namespace std; // Function to return the maximum// sum of the subsetint MaxSumSubset(vector<int>& values,                 vector<int>& labels,                 int n, int limit){    int res = 0;    multimap<int, int> s;    unordered_map<int, int> map;     if (n == 0)    {        return 0;    }     // Pushing the pair into    // the multimap    for (int i = 0; i < n; i++)    {        s.insert({ values[i],                  labels[i] });    }     // Traversing the multimap    // in reverse    for (auto it = s.rbegin();         it != s.rend() && n > 0; it++)    {            cout<<(it->first)<<" "<<it->second<<endl;        if (++map[it->second] <= limit)        {            res += it->first;          //cout<<"res = "<<res<<endl;            n--;        }    }    return res;}// Driver codeint main(){    vector<int> values = { 5, 3, 7, 1, 2 };    vector<int> labels = { 5, 7, 7, 7, 6 };         int n = sizeof(values) / sizeof(values[0]);    int limit = 2;         cout << MaxSumSubset(values, labels,                         n, limit);    return 0;}
# Python3 program to Find subset with# maximum sum under given condition.from collections import defaultdict # Function to return the maximum# sum of the subsetdef MaxSumSubset(values, labels,                 n, limit):                          res = 0    s = {}    map = defaultdict(int)     if (n == 0):        return 0     # Pushing the pair into    # the multimap    for i in range(n):        s[values[i]] = labels[i]     # Traversing the multimap    # in reverse    #s = reversed(sorted(s.keys()))    for it in sorted(s.keys(), reverse = True):        if n > 0:            if (map[s[it]] < limit):                res += it                #print("res = ",res)                 map[s[it]] += 1         n -= 1     return res # Driver codeif __name__ == "__main__":     values = [5, 3, 7, 1, 2]    labels = [5, 7, 7, 7, 6]     n = len(values)    limit = 2     print(MaxSumSubset(values, labels,                       n, limit)) # This code is contributed by ukasp
<script> // JavaScript program to Find subset with// maximum sum under given condition. // Function to return the maximum// sum of the subsetfunction MaxSumSubset(values,labels,n,limit){    let res = 0;    let s=new Map();    let map=new Map();      if (n == 0)    {        return 0;    }      // Pushing the pair into    // the multimap    for (let i = 0; i < n; i++)    {        s.set( values[i],                  labels[i] );    }      // Traversing the multimap    // in reverse    for (let [key,value] of s.entries())    {        if(!map.has(value))            map.set(value,0);        if (map.get(value) < limit)        {            map.set(value,map.get(value)+1);            res += key;          //cout<<"res = "<<res<<endl;            n--;        }    }    return res;} // Driver codelet values=[5, 3, 7, 1, 2];let labels=[5, 7, 7, 7, 6];let n= values.length;let limit = 2;document.write(MaxSumSubset(values, labels,n, limit));  // This code is contributed by avanitrachhadiya2155 </script>
17
 
Time Complexity: O(N), where N is the length of the array. 
ukasp
avanitrachhadiya2155
Arrays
Hash
Write From Home
Arrays
Hash
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Count pairs with given sum
Chocolate Distribution Problem
Window Sliding Technique
Reversal algorithm for array rotation
Next Greater Element
Internal Working of HashMap in Java
Count pairs with given sum
Hashing | Set 1 (Introduction)
Hashing | Set 3 (Open Addressing)
Hashing | Set 2 (Separate Chaining)