Guest User

dynamic coin collection

a guest
Dec 12th, 2015
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.31 KB | None | 0 0
  1. #include <set>
  2. #include <map>
  3. #include <vector>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. map<int, vector<vector<int>>> combinations_for_target;
  9.  
  10. vector<vector<int>> getCoinCombinationsWithTargetSumRecursive(const set<int>& coins, int target, int depth) {
  11.  
  12.     vector<vector<int>> coin_combinations;
  13.  
  14.     for (int coin : coins) {
  15.  
  16.         int remaining_value = target - coin;
  17.  
  18.         if (remaining_value == 0) {
  19.  
  20.             coin_combinations.push_back({coin});
  21.  
  22.         } else if (remaining_value > 0) {
  23.  
  24.             vector<vector<int>> potential_combinations = getCoinCombinationsWithTargetSumRecursive(coins, remaining_value, depth + 1);
  25.  
  26.             for (vector<int> combination : potential_combinations) {
  27.                 combination.push_back(coin);
  28.                 coin_combinations.push_back(combination);
  29.             }
  30.  
  31.         }
  32.  
  33.     }
  34.  
  35.     return coin_combinations;
  36. }
  37.  
  38. vector<vector<int>> getCoinCombinationsWithTargetSumDynamic(const set<int>& coins, int target) {
  39.  
  40.     vector<vector<int>> coin_combinations;
  41.  
  42.     for (int coin : coins) {
  43.  
  44.         int remaining_value = target - coin;
  45.  
  46.         if (remaining_value == 0) {
  47.  
  48.             coin_combinations.push_back({coin});
  49.  
  50.         } else if (remaining_value > 0) {
  51.  
  52.             if (combinations_for_target.at(remaining_value).size() > 0) {
  53.  
  54.                 for (vector<int> combination : combinations_for_target.at(remaining_value)) {
  55.  
  56.                     combination.push_back(coin);
  57.                     coin_combinations.push_back(combination);
  58.  
  59.                 }
  60.  
  61.             }
  62.  
  63.         }
  64.  
  65.     }
  66.  
  67.     return coin_combinations;
  68. }
  69.  
  70. vector<vector<int>> getCoinCombinationsWithTargetSum(const set<int>& coins, int target) {
  71.  
  72.     for (int current_target = 1; current_target <= target; current_target++) {
  73.         vector<vector<int>> coin_combinations = getCoinCombinationsWithTargetSumDynamic(coins, current_target);
  74.         combinations_for_target[current_target] = coin_combinations;
  75.  
  76.         cout << current_target << endl;
  77.     }
  78.  
  79.     return combinations_for_target.at(target);
  80. }
  81.  
  82.  
  83. int main(int argc, char const *argv[]) {
  84.  
  85.     for (auto cc : getCoinCombinationsWithTargetSum({1,5,10,25}, 100)) {
  86.         for (auto c : cc) {
  87.             cout << c << " ";
  88.         }
  89.         cout << endl;
  90.     }
  91.  
  92.     return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment