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 = 2Output:17Explanation: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 = 2Output: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; ` `} ` |

*chevron_right*

*filter_none*

**Output:**

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.