从CF1934B学习硬币问题的非DP做法

Problem - B - Codeforces

被DP给限制思路了

1|0思路

其实可以枚举前四个硬币的数量,然后通过倍数关系和更优的方案来限制每个硬币的枚举区间,最后再对剩余的值是否是最后一个硬币的倍数做检查,是就根据最小更新答案。

  • 一块钱最多两个,因为三个就可以直接用三块钱代替
  • 三块钱最多一个,因为两个可以被六块钱代替
  • 六块钱最多四个,因为五个可以被两个十五代替
  • 十块钱最多两个,三个可以用两个十五块代替

2|0代码

void solve() { int n; std::cin >> n; int ans = n; for (int a = 0; a < 3; a++)//一块钱最多两个,因为三个就可以直接用三块钱代替 { for (int b = 0; b < 2; b++)//三块钱最多一个,因为两个可以被六块钱代替 { for (int c = 0; c < 5; c++)//六块钱最多四个,因为五个可以被两个十五代替 { for (int d = 0; d < 3; d++)//十块钱最多两个,三个可以用两个十五块代替 { int res = n - a - 3 * b - 6 * c - 10 * d;//减完剩下的就是15块 if (res >= 0 && res % 15 == 0)//如果是15的倍数,说明答案合法,计算答案 { ans = std::min(ans, res / 15 + a + b + c + d); } } } } } std::cout << ans << "\n"; }

__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/18048442.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示