求解硬币组成问题
题目描述
实现一个算法求解组成硬币问题。介绍如下:
假设有面值给定的一些硬币,以及给定的总合值,问构成总合值的方法有多少种。
输入描述
- 第一行包含两个数字
N
,M
:N
表示硬币面值的种类数M
表示给定的总合值
- 第二行包含
N
个数字Ai
,表示每种硬币的面值。
数据范围:
1 ≤ N, M, Ai ≤ 1000
- 每种面值的硬币都有无限多个
输出描述
输出一行,为构成总合值的方法数。
输入输出样例
输入
3 3
1 2 3
输出
3
c++代码
#include<bits/stdc++.h>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
vector<int> dp(M + 1), arr(N);
for (int i = 0; i < N; i++) cin >> arr[i];
dp[0] = 1;
for (int i = 0; i < N; i++) {
for (int j = arr[i]; j <= M; j++) {
dp[j] += dp[j - arr[i]];
}
}
dp[0] = 0;
cout << dp[M];
return 0;
}//by wqs
算法解析
这个题目要求1 2和2 1是同一组合,所有我们规定第一层循环为前i个硬币而且,最后一个硬币是i的组合为多少,这样就不会出现2 1这样的情况了。