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

Problem - B - Codeforces

被DP给限制思路了

思路

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

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

代码

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";
}
posted @ 2024-03-02 11:36  加固文明幻景  阅读(17)  评论(0编辑  收藏  举报