贪心算法(Greedy):每一步都选当前最优的方案,期望最终结果也是最优。
核心思路:局部最优 → 全局最优。不需要回溯,不需要枚举所有情况。
典型题型:区间调度、活动选择、买菜砍价、排队分配等。解题套路:先排序,再按顺序贪。
经典题:活动安排——n个活动,每个有开始和结束时间,一个人同时只能参加一个,最多能参加几个?
贪心策略:按结束时间排序,每次选结束最早且不冲突的。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n >> m; // n种硬币,目标金额m
vector<int> coins(n);
for (int i = 0; i < n; i++)
cin >> coins[i]; // 读入面值
sort(coins.rbegin(), coins.rend()); // 从大到小排序
int cnt = 0;
for (int c : coins) {
while (m >= c) { // 能取就取
m -= c; // 扣掉面值
cnt++; // 硬币数+1
}
}
if (m == 0) cout << cnt << endl; // 刚好凑完
else cout << -1 << endl; // 凑不完
return 0;
}
// 输入: 3 11\n1 2 5 → 输出: 3 (5+5+1)
sort。