硬币问题
硬币问题
题目描述
今有面值为 1、5、11 元的硬币各无限枚。
想要凑出 \(n\) 元,问需要的最少硬币数量。
输入格式
仅一行,一个正整数 \(n\)。
输出格式
仅一行,一个正整数,表示需要的硬币个数。
样例 #1
样例输入 #1
15
样例输出 #1
3
样例 #2
样例输入 #2
12
样例输出 #2
2
提示
样例解释
对于样例数据 1,最佳方案是 \(15=5+5+5\),使用到 3 枚硬币。
对于样例数据 2,最佳方案是 \(12=11 + 1\),使用到 2 枚硬币。
数据规模与约定
对于 \(100\%\) 的数据,保证 \(n\leq 10^6\)。
分析
如果用贪心做是不对的,比如对于15 贪心得到的结果是11+1+1+1+1,但实际5+5+5就可以得到。这里我们把大问题问题化为小问题:差1元和差5元和差11元。
代码实现
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9; // 初始化一个很大的值,用于比较
int main() {
int n;
cin >> n;
vector<int> dp(n + 1, INF); // 创建一个大小为 n+1 的数组,用于存储最少硬币数
dp[0] = 0; // 0元需要0个硬币
for (int i = 1; i <= n; i++) {
if (i >= 1) dp[i] = min(dp[i], dp[i - 1] + 1); // 使用面值为1的硬币
if (i >= 5) dp[i] = min(dp[i], dp[i - 5] + 1); // 使用面值为5的硬币
if (i >= 11) dp[i] = min(dp[i], dp[i - 11] + 1); // 使用面值为11的硬币
}
cout << dp[n] << endl;
return 0;
}

浙公网安备 33010602011771号