给定一个整数N ,代表项目数量,两个数组P[]和C[] ,由N 个整数组成,以及两个整数W和K其中, W是初始资本金额, P[i]和C[i]是选择第i个项目所需的利润和资本。任务是计算最多选择K 个项目所需的最大资金量,从而将所选项目的利润添加到W并选择至少需要C[i] 的任何项目。
例子:
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
方法:给定的问题可以使用贪心算法和优先级队列来解决。请按照以下步骤解决问题:
- 初始化一个priority_queue PQ来存储所有资金最多为W的项目的利润。
- 使用变量i作为索引遍历数组C[]并将对{C[i], i}推送到对V的向量中。
- 相对于第一个元素按升序对向量 V 进行排序。
- 迭代直到K大于0 :
- 将优先队列PQ中所有资金最多为 W的项目的收益推送。
- 将资本金额W增加PQ的最大元素,即W += PQ.top() ,然后弹出PQ的顶部元素。
- 将K减1 。
- 完成以上步骤后,打印W的值作为得到的最大资本。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
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& profits,
vector& capital)
{
// Stores all projects with
// capital at most W
priority_queue pq;
// Stores the pair of {C[i], i}
vector > v;
// Travese 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 P = { 1, 2, 3 };
vector 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 pq = new PriorityQueue<>(
Collections.reverseOrder());
// Stores the pair of {C[i], i}
ArrayList v = new ArrayList<>();
// Travese 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.
4
时间复杂度: O(N * K * log N)
辅助空间: O(N)