硬币问题

硬币问题

题目描述

今有面值为 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;
}
posted @ 2023-08-30 22:51  LongDz  阅读(176)  评论(0)    收藏  举报