【动态规划DP:纸币硬币专题】P2840 纸币问题 2
P2840 纸币问题 2
https://www.luogu.com.cn/problem/P2840
难度:普及-
参考代码:
#include <bits/stdc++.h>
using namespace std;const int MOD = 1e9 + 7;int main() {int n, w;cin >> n >> w;vector<int> a(n+1);for (int i = 1; i <= n; i++) {cin >> a[i];}// dp[i]表示凑出金额i的方式数量vector<long long> dp(w + 1, 0);dp[0] = 1; // 凑出金额0只有1种方式:不使用任何纸币// 注意:由于顺序不同视为不同方式,我们需要先遍历金额再遍历硬币for (int i = 1; i <= w; i++) {for (int j = 1; j <= n; j++) {// 如果当前硬币面额不大于要凑的金额if (a[j] <= i) {// 累加使用这枚硬币的方式数量dp[i] = (dp[i] + dp[i - a[j]]) % MOD;}}}cout << dp[w] << endl;return 0;
}