原理在注释里,自己写的不是这样的,参照答案改的。自己写的是最原始版本的DP。
但这个推理貌似很厉害的样子,记住之。
/*
ID :
LANG: C++11
TASK: money
*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cmath>
#include <set>
using namespace std;
int main()
{
freopen("money.in", "r", stdin);
freopen("money.out", "w", stdout);
std::ios::sync_with_stdio(false);
int V, N;
cin >> V >> N;
int coins[30] = {};
long long int ways[11000] = {};
//ways(i, n) = ways(i - 1, n) + sigma<k> ways(i - 1, n - coins[i] * k);
//ways(i - 1, n - coins[i] * k) = ways(i - 1,
ways[0] = 1;
for (int i = 1; i <= V; i ++){
cin >> coins[i];
/*
for (int j = N; i >= 0; i ++){
ways[j] += ways[j] + sigma ways[j - k * coins[i]];
}
*/
for (int j = coins[i]; j <= N; j ++){
ways[j] += ways[j - coins[i]];
}
}
sort(coins + 1, coins + 1 + V, greater<int>());
cout << ways[N] << endl;
return 0;
}