我们知道人民币有1、2、5、10、20、50、100这几种面值。 现在给你 n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种。 比如4元,能用4张1元、2张1元和1张2元、2张 2元,三种表示方法。
时间: 2023-08-31 11:48:47 浏览: 184
[附答案]计算出需要的各种面值的钱币的类型及数量
这是一道比较经典的动态规划问题。我们可以定义一个状态数组`dp[i][j]`,表示使用前i种面值,总金额不超过j元,有多少种表示方法。则状态转移方程如下:
```
dp[i][j] = dp[i-1][j] + dp[i][j-v[i]] + dp[i][j-2v[i]] + ... + dp[i][j-kv[i]]
其中,v[i]表示第i种面值,k表示第i种面值使用的张数,满足j-kv[i]>=0且k<=100
```
最终的答案为`dp[7][n]`,因为一共有7种面值。
下面是C++代码实现:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1010;
int dp[8][N];
int main() {
int n;
cin >> n;
// 初始化边界状态
for (int i = 0; i <= 7; i++) dp[i][0] = 1;
int v[] = {0, 1, 2, 5, 10, 20, 50, 100};
for (int i = 1; i <= 7; i++) {
for (int j = 1; j <= n; j++) {
int k = 0;
while (j - k * v[i] >= 0 && k <= 100) {
dp[i][j] += dp[i-1][j-k*v[i]];
k++;
}
}
}
cout << dp[7][n] << endl;
return 0;
}
```
阅读全文