Untitled
Never
#include <bits/stdc++.h> using namespace std; vector<int> coins; int n; int dp[1005][1005]; set<vector<int>> ways; vector<int> cnt; int count(int i, int v) { if (v == 0) { ways.insert(cnt); return 1; } if (i <= 0 || v < 0) { return 0; } // if (dp[i][v] != -1) // return dp[i][v]; int exclude = count(i - 1, v); cnt.push_back(coins[i - 1]); int include = count(i, v - coins[i - 1]); cnt.pop_back(); return dp[i][v] = include + exclude; } int minCoins(int v) { for (int i = 0; i <= n; i++) { dp[i][0] = 0; } for (int i = 1; i <= v; i++) { dp[0][i] = INT_MAX; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= v; j++) { if (coins[i - 1] <= j) { dp[i][j] = min(dp[i - 1][j], dp[i][j - coins[i - 1]] + 1); } else { dp[i][j] = dp[i - 1][j]; } } } return dp[n][v]; } int number_of_ways(vector<int> coins, int val) { int n = coins.size(); vector<vector<int>> A(n, vector<int>(val + 1, 0)); for (int i = 0; i < n; i++) A[i][0] = 1; for (int i = 0; i < n; i++) { for (int j = 1; j <= val; j++) { if (i == 0) { if (j % coins[i] == 0) A[i][j] = 1; else A[i][j] = 0; } else { if (j < coins[i]) A[i][j] = A[i - 1][j]; else A[i][j] = A[i - 1][j] + A[i][j - coins[i]]; } } } return A[n - 1][val]; } int number_of_ways3(vector<int> coins, int val) { int n = coins.size(); vector<int> A(val + 1, 0); A[0] = 1; for (int i = 0; i < n; i++) { for (int j = 1; j <= val; j++) { if (j >= coins[i]) A[j] += A[j - coins[i]]; } } return A[val]; } int main() { int n; cin >> n; coins.resize(n); memset(dp, -1, sizeof(dp)); for (int i = 0; i < n; i++) cin >> coins[i]; int val; cin >> val; cout << count(n, val) << endl; for (auto i : ways) { for (auto j : i) cout << j << " "; cout << endl; } cout << minCoins(val) << endl; return 0; }