fbpx
Wikipedia

Change-making problem

The change-making problem addresses the question of finding the minimum number of coins (of certain denominations) that add up to a given amount of money. It is a special case of the integer knapsack problem, and has applications wider than just currency.

It is also the most common variation of the coin change problem, a general case of partition in which, given the available denominations of an infinite set of coins, the objective is to find out the number of possible ways of making a change for a specific amount of money, without considering the order of the coins.

It is weakly NP-hard, but may be solved optimally in pseudo-polynomial time by dynamic programming.[1][2]

Mathematical definition

Coin values can be modeled by a set of n distinct positive integer values (whole numbers), arranged in increasing order as w1 through wn. The problem is: given an amount W, also a positive integer, to find a set of non-negative (positive or zero) integers {x1, x2, ..., xn}, with each xj representing how often the coin with value wj is used, which minimize the total number of coins f(W)

 

subject to

 

Non-currency examples

An application of change-making problem can be found in computing the ways one can make a nine dart finish in a game of darts.

Another application is computing the possible atomic (or isotopic) composition of a given mass/charge peak in mass spectrometry.

Methods of solving

Simple dynamic programming

A classic dynamic programming strategy works upward by finding the combinations of all smaller values that would sum to the current threshold.[3] Thus, at each threshold, all previous thresholds are potentially considered to work upward to the goal amount W. For this reason, this dynamic programming approach requires a number of steps that is O(nW), where n is the number of types of coins.

Implementation

The following is a dynamic programming implementation (with Python 3) which uses a matrix to keep track of the optimal solutions to sub-problems, and returns the minimum number of coins, or "Infinity" if there is no way to make change with the coins given. A second matrix may be used to obtain the set of coins for the optimal solution.

def _get_change_making_matrix(set_of_coins, r: int): m = [[0 for _ in range(r + 1)] for _ in range(len(set_of_coins) + 1)] for i in range(1, r + 1): m[0][i] = float('inf') # By default there is no way of making change return m def change_making(coins, n: int):  """This function assumes that all coins are available infinitely.  n is the number to obtain with the fewest coins.  coins is a list or tuple with the available denominations.  """ m = _get_change_making_matrix(coins, n) for c, coin in enumerate(coins, 1): for r in range(1, n + 1): # Just use the coin if coin == r: m[c][r] = 1 # coin cannot be included. # Use the previous solution for making r, # excluding coin elif coin > r: m[c][r] = m[c - 1][r] # coin can be used. # Decide which one of the following solutions is the best: # 1. Using the previous solution for making r (without using coin). # 2. Using the previous solution for making r - coin (without # using coin) plus this 1 extra coin. else: m[c][r] = min(m[c - 1][r], 1 + m[c][r - coin]) return m[-1][-1] 

Dynamic programming with the probabilistic convolution tree

The probabilistic convolution tree[4] can also be used as a more efficient dynamic programming approach. The probabilistic convolution tree merges pairs of coins to produce all amounts which can be created by that pair of coins (with neither coin present, only the first coin present, only the second coin present, and both coins present), and then subsequently merging pairs of these merged outcomes in the same manner. This process is repeated until the final two collections of outcomes are merged into one, leading to a balanced binary tree with W log(W) such merge operations. Furthermore, by discretizing the coin values, each of these merge operations can be performed via convolution, which can often be performed more efficiently with the fast Fourier transform (FFT). In this manner, the probabilistic convolution tree may be used to achieve a solution in sub-quadratic number of steps: each convolution can be performed in n log(n), and the initial (more numerous) merge operations use a smaller n, while the later (less numerous) operations require n on the order of W.

The probabilistic convolution tree-based dynamic programming method also efficiently solves the probabilistic generalization of the change-making problem, where uncertainty or fuzziness in the goal amount W makes it a discrete distribution rather than a fixed quantity, where the value of each coin is likewise permitted to be fuzzy (for instance, when an exchange rate is considered), and where different coins may be used with particular frequencies.

Greedy method

For many real-world coin systems, such as those used in the US and many other countries, a greedy algorithm of picking the largest denomination of coin which is not greater than the remaining amount to be made will produce the optimal result. This is not the case for arbitrary coin systems or even some real world systems, though. For instance, if we consider the old (now withdrawn) Indian coin denominations of 5, 10, 20 and 25 paise, then to make 40 paise, the greedy algorithm would choose three coins (25, 10, 5) whereas the optimal solution is two coins (20, 20). A coin system is called "canonical" if the greedy algorithm always solves its change-making problem optimally. It is possible to test whether a coin system is canonical in polynomial time.[5]

Related problems

The "optimal denomination problem"[6] is a problem for people who design entirely new currencies. It asks what denominations should be chosen for the coins in order to minimize the average cost of making change, that is, the average number of coins needed to make change. The version of this problem assumed that the people making change will use the minimum number of coins (from the denominations available). One variation of this problem assumes that the people making change will use the "greedy algorithm" for making change, even when that requires more than the minimum number of coins. Most current currencies use a 1-2-5 series, but some other set of denominations would require fewer denominations of coins or a smaller average number of coins to make change or both.

See also

References

  1. ^ Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford (2009). Introduction to Algorithms. MIT Press. Problem 16-1, p. 446.
  2. ^ Goodrich, Michael T.; Tamassia, Roberto (2015). Algorithm Design and Applications. Wiley. Exercise A-12.1, p. 349.
  3. ^ Wright, J. W. (1975). "The change-making problem". Journal of the Association for Computing Machinery. 22 (1): 125–128. doi:10.1145/321864.321874. S2CID 22568052.
  4. ^ Serang, O. (2012). "The Probabilistic Convolution Tree: Efficient Exact Bayesian Inference for Faster LC-MS/MS Protein Inference". PLOS ONE. 9 (3): e91507. Bibcode:2014PLoSO...991507S. doi:10.1371/journal.pone.0091507. PMC 3953406. PMID 24626234.
  5. ^ Pearson, David (2005). "A polynomial-time algorithm for the change-making problem". Operations Research Letters. 33 (3): 231–234. doi:10.1016/j.orl.2004.06.001. hdl:1813/6219. MR 2108270.
  6. ^ J. Shallit (2003). "What this country needs is an 18c piece" (PDF). Mathematical Intelligencer. 25 (2): 20–23. doi:10.1007/BF02984830. S2CID 123286384.

Further reading

  • M. Adamaszek, A. Niewiarowska (2010). "Combinatorics of the change-making problem". European Journal of Combinatorics. 31 (1): 47–63. arXiv:0801.0120. doi:10.1016/j.ejc.2009.05.002. S2CID 13527488.

change, making, problem, confused, with, coin, problem, change, making, problem, addresses, question, finding, minimum, number, coins, certain, denominations, that, given, amount, money, special, case, integer, knapsack, problem, applications, wider, than, jus. Not to be confused with Coin problem The change making problem addresses the question of finding the minimum number of coins of certain denominations that add up to a given amount of money It is a special case of the integer knapsack problem and has applications wider than just currency It is also the most common variation of the coin change problem a general case of partition in which given the available denominations of an infinite set of coins the objective is to find out the number of possible ways of making a change for a specific amount of money without considering the order of the coins It is weakly NP hard but may be solved optimally in pseudo polynomial time by dynamic programming 1 2 Contents 1 Mathematical definition 2 Non currency examples 3 Methods of solving 3 1 Simple dynamic programming 3 1 1 Implementation 3 2 Dynamic programming with the probabilistic convolution tree 3 3 Greedy method 4 Related problems 5 See also 6 References 7 Further readingMathematical definition EditCoin values can be modeled by a set of n distinct positive integer values whole numbers arranged in increasing order as w1 through wn The problem is given an amount W also a positive integer to find a set of non negative positive or zero integers x1 x2 xn with each xj representing how often the coin with value wj is used which minimize the total number of coins f W f W j 1 n x j displaystyle f W sum j 1 n x j subject to j 1 n w j x j W displaystyle sum j 1 n w j x j W Non currency examples EditAn application of change making problem can be found in computing the ways one can make a nine dart finish in a game of darts Another application is computing the possible atomic or isotopic composition of a given mass charge peak in mass spectrometry Methods of solving EditSimple dynamic programming Edit A classic dynamic programming strategy works upward by finding the combinations of all smaller values that would sum to the current threshold 3 Thus at each threshold all previous thresholds are potentially considered to work upward to the goal amount W For this reason this dynamic programming approach requires a number of steps that is O nW where n is the number of types of coins Implementation Edit The following is a dynamic programming implementation with Python 3 which uses a matrix to keep track of the optimal solutions to sub problems and returns the minimum number of coins or Infinity if there is no way to make change with the coins given A second matrix may be used to obtain the set of coins for the optimal solution def get change making matrix set of coins r int m 0 for in range r 1 for in range len set of coins 1 for i in range 1 r 1 m 0 i float inf By default there is no way of making change return m def change making coins n int This function assumes that all coins are available infinitely n is the number to obtain with the fewest coins coins is a list or tuple with the available denominations m get change making matrix coins n for c coin in enumerate coins 1 for r in range 1 n 1 Just use the coin if coin r m c r 1 coin cannot be included Use the previous solution for making r excluding coin elif coin gt r m c r m c 1 r coin can be used Decide which one of the following solutions is the best 1 Using the previous solution for making r without using coin 2 Using the previous solution for making r coin without using coin plus this 1 extra coin else m c r min m c 1 r 1 m c r coin return m 1 1 Dynamic programming with the probabilistic convolution tree Edit The probabilistic convolution tree 4 can also be used as a more efficient dynamic programming approach The probabilistic convolution tree merges pairs of coins to produce all amounts which can be created by that pair of coins with neither coin present only the first coin present only the second coin present and both coins present and then subsequently merging pairs of these merged outcomes in the same manner This process is repeated until the final two collections of outcomes are merged into one leading to a balanced binary tree with W log W such merge operations Furthermore by discretizing the coin values each of these merge operations can be performed via convolution which can often be performed more efficiently with the fast Fourier transform FFT In this manner the probabilistic convolution tree may be used to achieve a solution in sub quadratic number of steps each convolution can be performed in n log n and the initial more numerous merge operations use a smaller n while the later less numerous operations require n on the order of W The probabilistic convolution tree based dynamic programming method also efficiently solves the probabilistic generalization of the change making problem where uncertainty or fuzziness in the goal amount W makes it a discrete distribution rather than a fixed quantity where the value of each coin is likewise permitted to be fuzzy for instance when an exchange rate is considered and where different coins may be used with particular frequencies Greedy method Edit For many real world coin systems such as those used in the US and many other countries a greedy algorithm of picking the largest denomination of coin which is not greater than the remaining amount to be made will produce the optimal result This is not the case for arbitrary coin systems or even some real world systems though For instance if we consider the old now withdrawn Indian coin denominations of 5 10 20 and 25 paise then to make 40 paise the greedy algorithm would choose three coins 25 10 5 whereas the optimal solution is two coins 20 20 A coin system is called canonical if the greedy algorithm always solves its change making problem optimally It is possible to test whether a coin system is canonical in polynomial time 5 Related problems EditThe optimal denomination problem 6 is a problem for people who design entirely new currencies It asks what denominations should be chosen for the coins in order to minimize the average cost of making change that is the average number of coins needed to make change The version of this problem assumed that the people making change will use the minimum number of coins from the denominations available One variation of this problem assumes that the people making change will use the greedy algorithm for making change even when that requires more than the minimum number of coins Most current currencies use a 1 2 5 series but some other set of denominations would require fewer denominations of coins or a smaller average number of coins to make change or both See also EditList of knapsack problems Coin problem The coin collector s problemReferences Edit Cormen Thomas H Leiserson Charles E Rivest Ronald L Stein Clifford 2009 Introduction to Algorithms MIT Press Problem 16 1 p 446 Goodrich Michael T Tamassia Roberto 2015 Algorithm Design and Applications Wiley Exercise A 12 1 p 349 Wright J W 1975 The change making problem Journal of the Association for Computing Machinery 22 1 125 128 doi 10 1145 321864 321874 S2CID 22568052 Serang O 2012 The Probabilistic Convolution Tree Efficient Exact Bayesian Inference for Faster LC MS MS Protein Inference PLOS ONE 9 3 e91507 Bibcode 2014PLoSO 991507S doi 10 1371 journal pone 0091507 PMC 3953406 PMID 24626234 Pearson David 2005 A polynomial time algorithm for the change making problem Operations Research Letters 33 3 231 234 doi 10 1016 j orl 2004 06 001 hdl 1813 6219 MR 2108270 J Shallit 2003 What this country needs is an 18c piece PDF Mathematical Intelligencer 25 2 20 23 doi 10 1007 BF02984830 S2CID 123286384 Further reading EditM Adamaszek A Niewiarowska 2010 Combinatorics of the change making problem European Journal of Combinatorics 31 1 47 63 arXiv 0801 0120 doi 10 1016 j ejc 2009 05 002 S2CID 13527488 Retrieved from https en wikipedia org w index php title Change making problem amp oldid 1115027079, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.