Maximum amount of capital required for selecting at most K projects

Given an integer N, representing number of projects, two arrays P[] and C[], consisting of N integers, and two integers W and K where, W is the initial capital amount, P[i] and C[i] are the profits and capital required to choose the ith project. The task is to calculate the maximum amount of capital required to choose at most K projects, such that the profit of the chosen projects is added to W and choosing any project required at least C[i].
Examples:
Input: N = 3, W = 0, K = 2, P[] = {1, 2, 3}, C[] = {0, 1, 1}
Output: 4
Explanation:
Project 1: With the given amount of W as 0, the 0th project can be chosen at a cost of C[0] i.e., 0, and after finishing the capital added to W i.e., W becomes W + P[0] = 1.
Project 2: With the given amount of W as 1, the 2nd project can be chosen at a cost of C[2] i.e., 1, and after finishing the capital added to W i.e., W becomes W + P[2] = 1 + 3 = 4.Input: N = 3, W = 1, K = 1, P[] = {10000, 2000, 3000}, C[] = {1, 1, 1}
Output: 10001
Approach: The given problem can be solved using the Greedy Algorithm and priority queue. Follow the steps below to solve the problem:
- Initialize a priority_queue PQ to store all the project’s profit whose capital is at most W.
- Traverse the array C[] using the variable i as the index and push the pair {C[i], i} in a vector of pairs V.
- Sort the vector V in ascending order with respect to the first element.
- Iterate until K is greater than 0:
- Push profit of all the projects that have not been selected yet and whose capital is at most W in the priority queue PQ.
- Increment the capital amount W by the maximum element of PQ i.e., W += PQ.top() and then pop the top element of PQ.
- Decrement the K by 1.
- After completing the above steps, print the value of W as the maximum capital obtained.
Below is the implementation of the above approach:
C++
// C++ program for the above approach#include <bits/stdc++.h>using namespace std;// Function to calculate maximum capital// obtained after choosing at most K// projects whose capital is less than// the given cost of projectsint maximizedCapital(int K, int W, vector<int>& profits, vector<int>& capital){ // Stores all projects with // capital at most W priority_queue<int> pq; // Stores the pair of {C[i], i} vector<pair<int, int> > v; // Traverse the vector C[] for (int i = 0; i < capital.size(); i++) { v.push_back({ capital[i], i }); } // Sort the vector v sort(v.begin(), v.end()); int j = 0; while (K) { // If capital is at most W while (j < (int)capital.size() && v[j].first <= W) { // Push the profit into // priority queue pq.push(profits[v[j].second]); // Increment j by one j++; } // If pq is not empty if (!pq.empty()) { // Update the capital W W = W + pq.top(); // Delete the top of pq pq.pop(); } // Decrement K by one K--; } // Return the maximum capital return W;}// Driver Codeint main(){ int K = 2; int W = 0; vector<int> P = { 1, 2, 3 }; vector<int> C = { 0, 1, 1 }; cout << maximizedCapital(K, W, P, C); return 0;} |
Java
// java program for the above approachimport java.io.*;import java.lang.*;import java.util.*;public class GFG { // Function to calculate maximum capital // obtained after choosing at most K // projects whose capital is less than // the given cost of projects static int maximizedCapital(int K, int W, int profits[], int capital[]) { // Stores all projects with // capital at most W PriorityQueue<Integer> pq = new PriorityQueue<>( Collections.reverseOrder()); // Stores the pair of {C[i], i} ArrayList<int[]> v = new ArrayList<>(); // Traverse the vector C[] for (int i = 0; i < capital.length; i++) { v.add(new int[] { capital[i], i }); } // Sort the vector v Collections.sort(v, (a, b) -> { if (a[0] != b[0]) return a[0] - b[0]; return a[1] - b[1]; }); int j = 0; while (K != 0) { // If capital is at most W while (j < capital.length && v.get(j)[0] <= W) { // Add the profit into // priority queue pq.add(profits[v.get(j)[1]]); // Increment j by one j++; } // If pq is not empty if (!pq.isEmpty()) { // Update the capital W W = W + pq.peek(); // Delete the top of pq pq.poll(); } // Decrement K by one K--; } // Return the maximum capital return W; } // Driver Code public static void main(String[] args) { int K = 2; int W = 0; int P[] = { 1, 2, 3 }; int C[] = { 0, 1, 1 }; System.out.println(maximizedCapital(K, W, P, C)); }}// This code is contributed by Kingash. |
Python3
from queue import PriorityQueue# Function to calculate maximum capital# obtained after choosing at most K# projects whose capital is less than# the given cost of projectsdef maximized_capital(k, w, profits, capital): # Stores all projects with # capital at most W pq = PriorityQueue() # Stores the pair of , i] v = [] # Traverse the vector C[] for i in range(len(capital)): v.append([capital[i], i]) # sort the vector v.sort() j = 0 while k: # if the capital is at most w while j < int(len(capital)) and v[j][0] <= w: # push the profit into # priority queue pq.put(-profits[v[j][1]]) # increment the j by 1 j += 1 # If pq i not empty if pq.empty() is not True: temp = pq.get() # Update the capital w and go for next w = w + abs(temp) # Decrement k by 1 k -= 1 # return the maximum capital return wK = 2W = 0P = [1, 2, 3]C = [0, 1, 1]print(maximized_capital(K, W, P, C))# This code is contributed by sdeadityasharma. |
Javascript
// Function to calculate maximum capital// obtained after choosing at most K// projects whose capital is less than// the given cost of projectsfunction maximized_capital(k, w, profits, capital) { // Stores all projects with capital at most W const pq = []; // Stores the pair of , i] const v = []; // Traverse the vector C[] for (let i = 0; i < capital.length; i++) { v.push([capital[i], i]); } // sort the vector v.sort((a, b) => a[0] - b[0]); let j = 0; while (k) { // if the capital is at most w while (j < capital.length && v[j][0] <= w) { // push the profit into priority queue pq.push(-profits[v[j][1]]); // increment the j by 1 j++; } // If pq is not empty if (pq.length) { const temp = pq.pop(); // Update the capital w and go for next w = w + Math.abs(temp); } // Decrement k by 1 k--; } // return the maximum capital return w;}const K = 2;const W = 0;const P = [1, 2, 3];const C = [0, 1, 1];console.log(maximized_capital(K, W, P, C));// This code is contributed by Aditya Sharma |
C#
// C# code for the above approachusing System;using System.Collections.Generic;public class Program{ // Function to calculate maximum capital // obtained after choosing at most K // projects whose capital is less than // the given cost of projects public static int MaximixedCapital(int K, int W, List<int> profits, List<int> capital) { // Stores all projects with // capital at most W PriorityQueue<int> pq = new PriorityQueue<int>(); // Stores the pair of , i] List<List<int>> v = new List<List<int>>(); // Traverse the vector C[] for (int i = 0; i < capital.Count; i++) { List<int> temp = new List<int>(); temp.Add(capital[i]); temp.Add(i); v.Add(temp); } // Sort the vector v v.Sort((a, b) => a[0].CompareTo(b[0])); int j = 0; while (K > 0) { // If the capital is at most W while (j < capital.Count && v[j][0] <= W) { // Push the profit into // priority queue pq.Push(-profits[v[j][1]]); // Increment j by 1 j += 1; } // If pq is not empty if (pq.Count != 0) { // Update the capital W and go for next W = W + Math.Abs(pq.Pop()); } // Decrement K by 1 K -= 1; } // Return the maximum capital return W; } public static void Main() { int K = 2; int W = 0; List<int> P = new List<int> { 1, 2, 3 }; List<int> C = new List<int> { 0, 1, 1 }; Console.WriteLine(MaximixedCapital(K, W, P, C)); }}// PriorityQueue implementation using SortedSetpublic class PriorityQueue<T> where T : IComparable<T>{ private SortedSet<T> data; public PriorityQueue() { data = new SortedSet<T>(); } public void Push(T item) { data.Add(item); } public T Pop() { T item = data.Min; data.Remove(item); return item; } public int Count { get { return data.Count; } }}// This code is contributed by princekumaras |
4
Time Complexity: O(N * K * log N)
Auxiliary Space: O(N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



