在 NOI Open Judge 6049 购书问题中,我们需要通过动态规划来解决如何用不同面值的货币购买书籍的问题。
以下是该问题的详细代码及解释:
#include
#include
#include
#include
using namespace std;
#define MAXN 1100
const int k[] = {0, 10, 20, 50, 100};
int dp[MAXN];
int main() {
int n;
cin >> n;
dp[0] = 1;
for (int i &#61; 1; i <&#61; 4; &#43;&#43;i) {
for (int j &#61; n; j >&#61; k[i]; --j) {
for (int l &#61; 1; l <&#61; j / k[i]; &#43;&#43;l) {
dp[j] &#43;&#61; dp[j - l * k[i]];
}
}
}
if (!n) dp[n] &#61; 0;
cout < return 0;
}
### 代码解释
1. **头文件**:引入了必要的头文件,包括输入输出、字符串处理等。
2. **常量定义**:定义了最大值 `MAXN` 和货币面值数组 `k`。
3. **动态规划数组**:`dp` 数组用于存储每个金额下的组合数。
4. **初始化**:将 `dp[0]` 初始化为 1,表示金额为 0 时有一种组合方式(即不使用任何货币)。
5. **动态规划过程**:通过三重循环,分别遍历货币面值、金额和组合数,更新 `dp` 数组。
6. **输出结果**:最后输出 `dp[n]`,即总金额为 `n` 时的组合数。