贪心要能证明
约 10 分钟
贪心最危险的地方是:它看起来对,但不一定真的最优。用之前一定要能说清"为什么每步都拿眼前最好的,最后合起来就是全局最好"。说不出理由,就别贸然用。
最有名的反例是硬币找零。面额 ,凑 :贪心每次拿最大的, 枚,而最优是 枚,贪心直接翻车。
// 一般面额下贪心会错,正确做法是完全背包 DP
dp[0] = 0;
for (int i = 1; i <= n; i++) {
dp[i] = INF;
for (int c : coins)
if (i >= c) dp[i] = min(dp[i], dp[i - c] + 1);
}
判断能不能用贪心,靠两条:要么能给出交换论证的证明,要么用小数据和暴力/DP 对拍验证。考场上拿不准时,宁可用更稳的 DP。贪心对了很快,错了是零分,别赌。
小纸条
找一个贪心失效的例子。
登录 后可看答案