测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A22785. 硬币

填空题 较易

题目描述

硬币

题目描述

可以使用任意数量的 a元硬币、b 元硬币和 c 元硬币。请找出恰好凑出 n 元所需的最小硬币总数。若无法凑出,则输出 -1。

输入格式

第一行,整数 n;

第二行,三个整数表示 a、b、c。

输出格式

输出最小硬币总数(若无法凑出则输出 -1)。

输入样例#1

100
20 40 50

输出样例#1

2

输入样例#2

99 
1 5 10

输出样例#2

14

参考答案

#include <iostream> using namespace std; int main() { int n; cin >> n; int a, b, c; cin >> a >> b >> c; int coins[3] = {a, b, c}; // 存储三种硬币面值 // 定义dp数组:dp[i]表示凑i元的最小硬币数 // 用n+1作为"不可达"的标记(因为最多需要n枚1元硬币,n+1一定大于可能的最大值) int* dp = new int[n + 1]; for (int i = 0; i <= n; ++i) { dp[i] = n + 1; // 初始化所有金额为"不可达" } dp[0] = 0; // 基准条件:0元需要0枚硬币 // 填充dp数组 for (int i = 1; i <= n; ++i) { for (int j = 0; j < 3; ++j) { // 遍历三种硬币 int coin = coins[j]; // 若当前金额i大于等于硬币面值,且"i-coin"金额可达,则尝试更新 if (i >= coin && dp[i - coin] + 1 < dp[i]) { dp[i] = dp[i - coin] + 1; } } } // 输出结果:若dp[n]仍为n+1,说明无法凑出,否则输出最小硬币数 cout << (dp[n] > n ? -1 : dp[n]) << endl; // 释放动态分配的内存 delete[] dp; return 0; }
上一题 下一题