我们知道人民币有 $1$、$2$、$5$、$10$、$20$、$50$、$100$ 这几种面值。 现在给你 $n$ $(1 \le n \le 250)$ 元,让你计算换成用上面这些面额表示且总数不超过 $100$ 张,共有几种。 比如 $4$ 元,能用 $4$ 张 $1$ 元、$2$ 张 $1$ 元和 $1$ 张 $2$ 元、$2$ 张 $2$ 元三种表示方法。c++
时间: 2023-08-30 19:06:18 浏览: 226
可以使用动态规划来解决这个问题。令 $dp[i][j]$ 表示用前 $i$ 种面额表示 $j$ 元的方案数,则有以下状态转移方程:
$$dp[i][j]=\sum_{k=0}^{\lfloor \frac{j}{v_i} \rfloor}dp[i-1][j-kv_i]$$
其中 $v_i$ 表示第 $i$ 种面额的面值。初始状态为 $dp[0][0]=1$,其余为 $0$。最终答案为 $\sum_{i=0}^{100}dp[7][i]$。
以下是 C++ 代码实现:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
int dp[8][101];
int main() {
int v[8] = {0, 1, 2, 5, 10, 20, 50, 100}; // 面值数组
dp[0][0] = 1;
for (int i = 1; i <= 7; ++i) {
for (int j = 0; j <= 100; ++j) {
for (int k = 0; k <= j / v[i]; ++k) {
dp[i][j] += dp[i - 1][j - k * v[i]];
}
}
}
int n;
while (cin >> n) {
cout << dp[7][n] << endl;
}
return 0;
}
```
注意:本题的输出结果需要每组数据输出一个换行符。\n
阅读全文