把"挑最短的"写出来,和正确的比
补全 sched(key 决定按什么排),对三场会 [(0,4),(3,5),(4,8)] 跑两遍:按时长最短和按结束最早。 把两个场次数拼起来输出(最短的在前)。
⚠️ 让程序自己去搜反例
补全代码:面值 4、3、1,金额从 1 往上一个个试,输出第一个贪心比最优差的金额。
⚠️ 有的面值搜到 200 也搜不出反例
同一个搜法跑两组面值,金额都试到 200 为止: 4、3、1:输出第一个反例金额 25、10、5、1:搜完都没有,输出 没找到反例 两个结果用 / 拼起来输出。
贪心和动态规划的根本区别
贪心和动态规划的根本区别是【0】。
什么时候必须换成 DP
一个问题必须用 DP 而不能用贪心,是因为【0】。
⚠️ 装不满的背包:贪心和最优
背包能装 10,三件物品是 (重量6,价值30)、(重量5,价值20)、(重量5,价值20),每件要么整件拿走要么不拿。运行下面这段程序: def knap_greedy(items, cap): v = 0 for w,
同样的东西,能切开就不一样了
还是这三件、还是装 10,但这次可以切开按比例拿(切下来那部分的价值按 价值 * 剩余容量 // 重量 算,保证整除)。运行下面这段程序: def knap_frac(items, cap): v = 0 for w, va
写 0-1 背包的贪心
补全 knap_greedy:按每公斤值多少从高到低排,装得下就整件拿走。输出总价值。
写 0-1 背包的动态规划
补全 knap_dp:dp[c] 表示容量 c 时的最大价值,每件物品容量从大往小更新一遍。输出最大价值。
写可以切开的背包
补全 knap_frac:同样按每公斤价值排,装得下就整件拿,装不下就切一块把包填满(切下来的价值用 val * cap // w)。