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 occurrence is <= limit.
Below is the implementation of the above approach:
// 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 subset int 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++) { if (++map[it->second] <= limit) { res += it->first; n--; } } return res; } // Driver code int 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; } |
17
Time Complexity: O(N), where N is the length of the array.
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.