给你六种面额 1、5、10、20、50、100 元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0~10000的非负整数)的不同组合的个数。
dp[i][j] 前i种硬币能构成j的价值的放法数
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
int main() {
using namespace std;
int n;
while (cin >> n) {
int arr[] = { 1, 5, 10, 20, 50, 100 };
int rows = sizeof(arr) / sizeof(arr[0]);
vector<vector<long long> > dp(rows, vector<long long>(n+1, 0));
for (int i = 0; i <= n; i++) {
dp[0][i] = 1;
}
for (int i = 1; i < rows; i++) {
for (int j = 0; j <= n; j++) {
int m = j / arr[i];
for (int k = 0; k <= m; k++) {
dp[i][j] = dp[i][j] + dp[i - 1][j - k * arr[i]];
}
}
}
cout << dp[rows - 1][n] << endl;
}
return 0;
}