c++实现考虑著名找零问题的一般情形:需找零金额为n,最少要用多少面值为d1<d2<...<dm的硬币? 【输入形式】 第一行一个整数n( n ≤ 10000 ),表示需找零的金额。第二行一个整数m( m ≤ 100 ),表示硬币面值的个数。第三行为m个整数,表示m个硬币的面值d1<d2<...<dm,其中d1=1。【输出形式】 找零所需的数量最少的硬币数目。
时间: 2024-03-15 20:46:04 浏览: 106
好的,以下是C++实现的代码:
```c++
#include <iostream>
#include <algorithm>
#include <climits>
using namespace std;
const int MAXN = 10010;
const int MAXM = 110;
int n, m;
int d[MAXM];
int dp[MAXN];
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> d[i];
}
dp[0] = 0;
for (int i = 1; i <= n; i++) {
dp[i] = INT_MAX; // 初始化为无穷大
for (int j = 1; j <= m; j++) {
if (i >= d[j]) {
dp[i] = min(dp[i], dp[i - d[j]] + 1);
}
}
}
cout << dp[n] << endl;
return 0;
}
```
我们首先读入 n 和 m,然后读入 m 个硬币面值。接下来,我们初始化 dp[0] 为 0,因为找零 0 元不需要任何硬币。然后,我们使用双重循环来进行状态转移,其中外层循环枚举所有的金额 i,内层循环枚举所有的硬币面值。如果当前的金额 i 大于等于硬币面值 d[j],那么我们就可以用一枚面值为 d[j] 的硬币来找零 i 元,然后再用 dp[i - d[j]] 个硬币来找零剩余的部分。因此,总共需要的硬币数目就是 dp[i - d[j]] + 1。最终的答案就是 dp[n]。
阅读全文