从CF1934B学习硬币问题的非DP做法
被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";
}