贪心要能证明

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。贪心对了很快,错了是零分,别赌。

小纸条

找一个贪心失效的例子。

登录 后可看答案

贪心要能证明 · 考级冲刺 · op599 课程