leoanjos

Infinite Coins

May 29th, 2022
1,176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.11 KB | None | 0 0
  1. vector<int> coins;
  2. vector<vector<tuple<int, int, int, int>>> memo;
  3.  
  4. vector<tuple<int, int, int, int>> ways(int money) {
  5.     if (money < 0) return {};
  6.     if (money == 0) return vector<tuple<int, int, int, int>>(1, make_tuple(0, 0, 0, 0));
  7.    
  8.     vector<tuple<int, int, int, int>> &ans = memo[money];
  9.     if (!ans.empty()) return ans;
  10.    
  11.     for (int coin: coins) {
  12.         vector<tuple<int, int, int, int>> aux = ways(money - coin);
  13.         for (auto [quarters, dimes, nickels, pennies]: aux) {
  14.             int dq = coin == 25 ? 1 : 0;
  15.             int dd = coin == 10 ? 1 : 0;
  16.             int dn = coin == 5 ? 1 : 0;
  17.             int dp = coin == 1 ? 1 : 0;
  18.             ans.emplace_back(quarters + dq, dimes + dd, nickels + dn, pennies + dp);
  19.         }
  20.     }
  21.    
  22.     return ans;
  23. }
  24.  
  25. int main() {
  26.     int money; cin >> money;
  27.    
  28.     memo.assign(money + 1, vector<tuple<int, int, int, int>>());
  29.    
  30.     vector<tuple<int, int, int, int>> ans = ways(money);
  31.     for (auto [quartes, dimes, nickels, pennies]: ans)
  32.         cout << quarters << " " << dimes << " " << nickels << " " << pennies << "\n";
  33. }
Advertisement
Add Comment
Please, Sign In to add comment