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 projects int 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 Code int 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 approach import 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 projects def 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 w Â
K = 2 W = 0 P = [ 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 projects function 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 approach using 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 SortedSet public 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 neveropen!