📌  相关文章
📜  最多选择K个项目所需的最大资金量

📅  最后修改于: 2021-05-04 15:17:37             🧑  作者: Mango

给定一个表示项目数的整数N ,两个数组P []C []N个整数以及两个整数WK组成,其中W为初始资本金额, P [i]C [i]选择第i项目所需的利润和资本。任务是计算选择最多K个项目所需的最大资本量,以便将所选项目的利润加到W中,并选择至少需要C [i]的任何项目。

例子:

方法:可以使用贪婪算法和优先级队列来解决给定的问题。请按照以下步骤解决问题:

  • 初始化一个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;
}


输出:
4

时间复杂度: O(N * K * log N)
辅助空间: O(N)