🍔 经典案例:活动安排问题
假设你是学生会主席,要安排社团活动。每个活动有开始和结束时间,如何安排才能举办最多活动?
贪心算法的解决方案出奇简单:
按结束时间从早到晚排序
每次都选最早结束的、且不与已选活动冲突的活动
按结束时间从早到晚排序
每次都选最早结束的、且不与已选活动冲突的活动
sort(所有活动.begin, 所有活动.end, 按结束时间排序);
vector<活动> 已选活动;
已选活动.push_back(所有活动[0]);
int上次结束时间 = 所有活动[0].结束时间;
for(inti = 1; i < 所有活动.size; i++) {
if(所有活动[i].开始时间 >= 上次结束时间) {
已选活动.push_back(所有活动[i]);
上次结束时间 = 所有活动[i].结束时间;
}
}
return已选活动;
}
这个算法为什么有效?因为早结束的活动给后面留出了更多空间!
💰 另一个案例:零钱兑换
假设你是收银员,要给顾客找零41元,如何用最少的纸币(假设有25元、20元、10元、5元、1元)?
贪心策略是:
每次都选不超过剩余金额的最大面额
25元 → 10元 → 5元 → 1元
共4张:25+10+5+1
每次都选不超过剩余金额的最大面额
25元 → 10元 → 5元 → 1元
共4张:25+10+5+1
但注意!如果纸币面额是25元、20元、10元、5元、1元,最优解其实是20+20+1,只需3张!这说明贪心算法并不总是最优。
🚫 贪心算法的局限性
贪心算法虽然简单高效,但有几个致命弱点:
0-1背包问题:一个小偷不能像在自助餐厅那样只拿牛排最好吃的部分
带负权的最短路径:Dijkstra算法遇到"倒贴钱"的路就懵了
需要全局考虑的问题:比如下棋,局部最优走法可能导致全盘皆输
0-1背包问题:一个小偷不能像在自助餐厅那样只拿牛排最好吃的部分
带负权的最短路径:Dijkstra算法遇到"倒贴钱"的路就懵了
需要全局考虑的问题:比如下棋,局部最优走法可能导致全盘皆输
vector
"人生重大决策", // 不能只看眼前
"长期投资规划", // 需要长远眼光
"复杂系统设计", // 要考虑整体架构
"人际关系处理"// 需要同理心和换位思考
};
🌈 生活中的贪心智慧
虽然贪心算法在计算机中有局限,但生活中有些场景确实适用:
时间管理:先处理最紧急重要的事(类似活动安排)
断舍离:每次丢弃最没用的物品(类似背包问题)
学习路径:先掌握最基础的知识(类似拓扑排序)
时间管理:先处理最紧急重要的事(类似活动安排)
断舍离:每次丢弃最没用的物品(类似背包问题)
学习路径:先掌握最基础的知识(类似拓扑排序)
记住老马的忠告:该贪心时贪心,不该贪心时别勉强!
📚 技术总结
贪心算法的三大要点:
简单粗暴效率高
适用问题有特殊要求
使用前必须验证是否适用
简单粗暴效率高
适用问题有特殊要求
使用前必须验证是否适用
💡 思考题
最后留个思考题:在爱情中,一直选择"当下看起来最好"的伴侣,最终能找到最佳伴侣吗?欢迎在评论区分享你的见解!返回搜狐,查看更多