Maximum amount of capital required for selecting at most K projects
Last Updated :
07 Mar, 2023
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:
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int maximizedCapital( int K, int W,
vector< int >& profits,
vector< int >& capital)
{
priority_queue< int > pq;
vector<pair< int , int > > v;
for ( int i = 0;
i < capital.size(); i++) {
v.push_back({ capital[i], i });
}
sort(v.begin(), v.end());
int j = 0;
while (K) {
while (j < ( int )capital.size()
&& v[j].first <= W) {
pq.push(profits[v[j].second]);
j++;
}
if (!pq.empty()) {
W = W + pq.top();
pq.pop();
}
K--;
}
return W;
}
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
import java.io.*;
import java.lang.*;
import java.util.*;
public class GFG {
static int maximizedCapital( int K, int W, int profits[],
int capital[])
{
PriorityQueue<Integer> pq = new PriorityQueue<>(
Collections.reverseOrder());
ArrayList< int []> v = new ArrayList<>();
for ( int i = 0 ; i < capital.length; i++) {
v.add( new int [] { capital[i], i });
}
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 ) {
while (j < capital.length && v.get(j)[ 0 ] <= W) {
pq.add(profits[v.get(j)[ 1 ]]);
j++;
}
if (!pq.isEmpty()) {
W = W + pq.peek();
pq.poll();
}
K--;
}
return W;
}
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));
}
}
|
Python3
from queue import PriorityQueue
def maximized_capital(k, w, profits, capital):
pq = PriorityQueue()
v = []
for i in range ( len (capital)):
v.append([capital[i], i])
v.sort()
j = 0
while k:
while j < int ( len (capital)) and v[j][ 0 ] < = w:
pq.put( - profits[v[j][ 1 ]])
j + = 1
if pq.empty() is not True :
temp = pq.get()
w = w + abs (temp)
k - = 1
return w
K = 2
W = 0
P = [ 1 , 2 , 3 ]
C = [ 0 , 1 , 1 ]
print (maximized_capital(K, W, P, C))
|
Javascript
function maximized_capital(k, w, profits, capital)
{
const pq = [];
const v = [];
for (let i = 0; i < capital.length; i++) {
v.push([capital[i], i]);
}
v.sort((a, b) => a[0] - b[0]);
let j = 0;
while (k) {
while (j < capital.length && v[j][0] <= w) {
pq.push(-profits[v[j][1]]);
j++;
}
if (pq.length) {
const temp = pq.pop();
w = w + Math.abs(temp);
}
k--;
}
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));
|
C#
using System;
using System.Collections.Generic;
public class Program
{
public static int MaximixedCapital( int K, int W, List< int > profits, List< int > capital)
{
PriorityQueue< int > pq = new PriorityQueue< int >();
List<List< int >> v = new List<List< int >>();
for ( int i = 0; i < capital.Count; i++)
{
List< int > temp = new List< int >();
temp.Add(capital[i]);
temp.Add(i);
v.Add(temp);
}
v.Sort((a, b) => a[0].CompareTo(b[0]));
int j = 0;
while (K > 0)
{
while (j < capital.Count && v[j][0] <= W)
{
pq.Push(-profits[v[j][1]]);
j += 1;
}
if (pq.Count != 0)
{
W = W + Math.Abs(pq.Pop());
}
K -= 1;
}
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));
}
}
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; }
}
}
|
Time Complexity: O(N * K * log N)
Auxiliary Space: O(N)
Share your thoughts in the comments
Please Login to comment...