题目:
https://www.luogu.com.cn/problem/B3635
用贪心可以但是会有测试点不过。比如15,11+1+1+1+1=15.或者5+5+5=15,如果你是贪心把最大值的硬币放在第一个,那么这个测试点就错误了。用记忆化搜索可以,因为贪心只能测一次,记忆化可以测多次,求出最少硬币的可能。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
ll num[4] = {0,1,5,11};
ll dfs(ll n)
{
if(n == 0)
return 0;
ll sum = 1e9;
for(int i = 1 ; i <= 3 ; i++)
{
if(n >= num[i])
{
sum = min(sum,dfs(n-num[i]) + 1);
}
}
return sum;
}
int main()
{
cin >> n;
cout << dfs(n);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
const ll N = 1e6+10;
ll num[4] = {0,1,5,11};
ll mem[N];
ll dfs(ll n)
{
if(mem[n])
return mem[n];
if(n == 0)
return 0;
ll sum = 1e9;
for(int i = 1 ; i <= 3 ; i++)
{
if(n >= num[i])
{
sum = min(sum,dfs(n-num[i]) + 1);
}
}
mem[n] = sum;
return sum;
}
int main()
{
cin >> n;
cout << dfs(n);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
const ll N = 1e6+10;
ll num[4] = {0,1,5,11};
ll mem[N];
ll dfs(ll n)
{
if(mem[n])
return mem[n];
if(n == 0)
return 0;
ll sum = 1e9;
for(int i = 1 ; i <= 3 ; i++)
{
if(n >= num[i])
{
sum = min(sum,dfs(n-num[i]) + 1);
}
}
mem[n] = sum;
return sum;
}
int main()
{
cin >> n;
cout << dfs(n);
return 0;
}