前言:
貪心算法(Greedy Algorithm)是一種在每個決策階段都選擇當前最優解的算法策略,通過局部最優的累積來尋求全局最優解。其本質是"短視"策略,不回溯已做選擇。
什么是貪心、如何來理解貪心(個人對貪心的理解)
前言對貪心是一種概念的回答。接下來就了解一下自己對貪心的理解,如果學習算法的化建議優先學習動態規劃,動態規劃相對于其他算法來說很簡單。但是,貪心算法跟動態規劃不同,非常難,貪心講究策略,每一道貪心有每一道貪心題解題的策略。
什么是貪心算法:
解決問題的策略,由局部最優到全局最優,把解決問題的過程分為若干步,在解決每一步的時候,都選擇當前看起來最優的解法,貪心就體現在最優上,希望得到全局最優,但只是看起來最優,在每一步的過程中都選擇當前看起來最優的策略(找零問題),簡單來說就是只考慮眼前的利益,目光不長遠。
貪心算法的特點:
貪心策略的提出,可以看出貪心策略的提出是沒有標準模板的,可能換一道貪心題其貪心策略也就不一樣了,這也就是貪心難的地方了,可能每一道貪心題的貪心策略都是不同的。因為貪心是數目寸光的,所以就要考慮到貪心策略的正確性,有可能貪心策略是一個錯誤的方法,所以正確的貪心策略是需要嚴格證明的,說到貪心策略的證明,在數學上你見到的還是你沒有見到的證明方法都可以拿來證明。
找零問題
#include <vector>
#include <algorithm>
using namespace std;vector<int> greedyCoinChange(int amount, vector<int> coins) {sort(coins.rbegin(), coins.rend()); // 降序排列vector<int> result;for (int coin : coins) {while (amount >= coin) {result.push_back(coin);amount -= coin;}}return (amount == 0) ? result : vector<int>(); // 返回空表示無解
}
活動選擇
struct Activity {int start, end;
};vector<Activity> selectActivities(vector<Activity> activities) {sort(activities.begin(), activities.end(), [](const auto& a, const auto& b){ return a.end < b.end; });vector<Activity> selected;int lastEnd = -1;for (auto& act : activities) {if (act.start >= lastEnd) {selected.push_back(act);lastEnd = act.end;}}return selected;
}