Problem 31 : Coin sums
In England the currency is made up of pound, £, and pence, p, and there are eight coins in general circulation:
1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p).
It is possible to make £2 in the following way:
1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p
How many different ways can £2 be made using any number of coins?
C++ source code
#include <iostream>
using namespace std;
class PE0031
{
public:
int ways(int target, int avc);
};
int PE0031::ways(int target, int avc)
{
// eight coin: 1p, 2p, 5p, 10p, 20p, 50p, L1 (100p) and L2 (200p)
int coins[8] = {1, 2, 5, 10, 20, 50, 100, 200};
if(avc == 0)
{
return 1;
}
int res = 0;
while(target >= 0 && avc>0)
{
res += ways(target, avc-1);
target -= coins[avc];
}
return res;
}
int main()
{
PE0031 pe0031;
cout << "L2(200p) can be made using any number of coins different ways ";
cout << pe0031.ways(200, 7) << endl;
return 0;
}
Python source code
# Recursive method to get all ways
def ways(target, avc):
# coins 1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p)
coins = [1, 2, 5, 10, 20, 50, 100, 200]
if(avc == 0):
return 1
res = 0
while target >= 0 and avc > 0:
res += ways(target, avc-1)
target -= coins[avc];
return res
# Another recursive method to get all ways
def count(n, m):
# eight coins: 1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p)
coins = [0, 1, 2, 5, 10, 20, 50, 100, 200]
if n < 0 or m <= 0: #m < 0 for zero indexed programming languages
return 0
# needs to be checked after n & m, as if n = 0 and m < 0 then it
# would return 1, which should not be the case.
if n == 0:
return 1
return count(n, m-1) + count(n-coins[m], m)
# Coin Change – Algorithmist http://www.algorithmist.com/index.php/Coin_Change
# Dynamic Programming Solution to the Coin Changing Problem
def getWays(target):
# coins 1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p)
coins = [1, 2, 5, 10, 20, 50, 100, 200]
Ways = [1] + [0]*target
for coin in coins:
for i in range(coin, target+1):
Ways[i] += Ways[i-coin]
return Ways[target]
def main():
print("£2 can be made using any number of coins different ways",ways(200,7))
print("£2 can be made using any number of coins different ways",getWays(200))
print("£2 can be made using any number of coins different ways",count(200,8))
if __name__ == '__main__':
main()