21xrx.com
2024-11-22 07:18:26 Friday
登录
文章检索 我的文章 写文章
C++贪心算法模板
2023-07-03 06:45:59 深夜i     --     --
- C++ - 贪心算法 - 模板

贪心算法是一种常用的算法思想,它通过每一步都选取当前最优解来达到整体最优解的目的。C++贪心算法模板可以方便地帮助我们实现贪心算法。

一、常用模板

1. 背包问题

背包问题是一个典型的贪心算法问题。根据贪心策略,我们需要尽可能地选取价值比较高的物品放在背包中,以达到背包价值最大化的目的。以下是一个简单的背包问题的贪心算法模板。

int KnapsackProblem(int weight[], int value[], int n, int W)

{

  vector > product;

  for (int i = 0; i < n; i++)

    product.push_back({ value[i], weight[i] });

  sort(product.begin(), product.end(), greater >());

  int totalValue = 0, currentWeight = 0, i = 0;

  while (i < n && currentWeight < W)

  {

    int tmp = min(W - currentWeight, product[i].second);

    totalValue += tmp * product[i].first;

    currentWeight += tmp;

    i++;

  }

  return totalValue;

}

2. 最小生成树问题

最小生成树问题也是一个非常典型的贪心算法问题,它用于求有权无向图的最小生成树。该问题也可以通过贪心策略来解决,可以使用Kruskal算法或Prim算法。以下是一个简单的Prim算法的贪心算法模板。

void PrimAlgorithm(int graph[V][V])

{

  int key[V], parent[V];

  bool mstSet[V];

  for (int i = 0; i < V; i++)

  {

    key[i] = INT_MAX, mstSet[i] = false;

  }

  key[0] = 0, parent[0] = -1;

  for (int i = 0; i < V - 1; i++)

  {

    int min = INT_MAX, minIndex;

    for (int j = 0; j < V; j++)

    {

      if (!mstSet[j] && key[j] < min)

        min = key[j], minIndex = j;

    }

    mstSet[minIndex] = true;

    for (int j = 0; j < V; j++)

      if (graph[minIndex][j] && !mstSet[j] && graph[minIndex][j] < key[j])

        parent[j] = minIndex, key[j] = graph[minIndex][j];

  }

  return;

}

3. 贪心数列问题

贪心数组问题也是一种常见的贪心算法问题。在该问题中,我们需要找到一个给定数列中的一组连续子序列,使得该子序列的和最大。以下是一个简单的贪心数列问题的贪心算法模板。

int MaximumSubarray(int arr[], int n)

{

  int maxSum = INT_MIN, curSum = 0;

  for (int i = 0; i < n; i++)

  {

    curSum += arr[i];

    if (maxSum < curSum)

      maxSum = curSum;

    if (curSum < 0)

      curSum = 0;

  }

  return maxSum;

}

二、总结

以上是C++贪心算法的几个常用模板,当然这只是贪心算法的冰山一角。在实际的应用场景中,我们可能会遇到不同的问题,需要根据具体的情况来应对。总的来说,贪心算法在计算复杂度低、执行效率高、代码简单易懂等方面具有优势,是很值得掌握和使用的一种算法。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复