Advertisement
Guest User

dynamic unique coin collection

a guest
Dec 12th, 2015
165
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. #include <algorithm>
  6.  
  7. using namespace std;
  8.  
  9. map<int, set<vector<int>>> combinations_for_target;
  10.  
  11. vector<vector<int>> getCoinCombinationsWithTargetSumRecursive(const set<int>& coins, int target, int depth) {
  12.  
  13.     vector<vector<int>> coin_combinations;
  14.  
  15.     for (int coin : coins) {
  16.  
  17.         int remaining_value = target - coin;
  18.         if (remaining_value == 0) {
  19.             coin_combinations.push_back({coin});
  20.         } else if (remaining_value > 0) {
  21.  
  22.             vector<vector<int>> potential_combinations = getCoinCombinationsWithTargetSumRecursive(coins, remaining_value, depth + 1);
  23.             for (vector<int> combination : potential_combinations) {
  24.                 combination.push_back(coin);
  25.                 coin_combinations.push_back(combination);
  26.             }
  27.  
  28.         }
  29.  
  30.     }
  31.  
  32.     return coin_combinations;
  33. }
  34.  
  35. set<vector<int>> getCoinCombinationsWithTargetSumDynamic(const set<int>& coins, int target) {
  36.  
  37.     set<vector<int>> coin_combinations;
  38.  
  39.     for (int coin : coins) {
  40.  
  41.         int remaining_value = target - coin;
  42.         if (remaining_value == 0) {
  43.             coin_combinations.insert({coin});
  44.         } else if (remaining_value > 0) {
  45.  
  46.             for (vector<int> combination : combinations_for_target.at(remaining_value)) {
  47.                 combination.push_back(coin);
  48.                 sort(combination.begin(), combination.end());
  49.                 coin_combinations.insert(combination);
  50.             }
  51.         }
  52.     }
  53.  
  54.     return coin_combinations;
  55. }
  56.  
  57. set<vector<int>> getCoinCombinationsWithTargetSum(const set<int>& coins, int target) {
  58.  
  59.     for (int current_target = 1; current_target <= target; current_target++) {
  60.         set<vector<int>> coin_combinations = getCoinCombinationsWithTargetSumDynamic(coins, current_target);
  61.         combinations_for_target[current_target] = coin_combinations;
  62.  
  63.         cout << current_target << " - " << combinations_for_target[current_target].size() << endl;
  64.     }
  65.  
  66.     return combinations_for_target.at(target);
  67. }
  68.  
  69.  
  70. int main(int argc, char const *argv[]) {
  71.  
  72.     for (auto cc : getCoinCombinationsWithTargetSum({1,5,10,25,100,200}, 500)) {
  73.         for (auto c : cc) {
  74.             cout << c << " ";
  75.         }
  76.         cout << endl;
  77.     }
  78.  
  79.     return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement