This repository has been archived by the owner on Aug 23, 2023. It is now read-only.
/
CoinChangeProblems.cs
105 lines (79 loc) · 2.59 KB
/
CoinChangeProblems.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
using System.Collections.Generic;
namespace CS.Problems.DynamicProgramming
{
/// <summary>
/// Problem statement in detail below
/// http://www.geeksforgeeks.org/dynamic-programming-set-7-coin-change/
/// </summary>
public class CoinChangeProblems
{
//O(amount * n^n) without memoization?
//O(amount * n) with memoization
public static int MinCoinChangeRecursive(int amount, int n, int[] coins, Dictionary<int, int> memoizingCache)
{
var key = amount;
if (memoizingCache.ContainsKey(key))
{
return memoizingCache[key];
}
int result;
//no coins to pick from
if (amount <= 0 || n < 0)
{
result = 0;
}
var min = int.MaxValue;
for (int j = 0; j < n; j++)
{
//if this coin size is greater than the sum skip it; no use of this coin
if (coins[j] <= amount)
{
var prevMin = MinCoinChangeRecursive(amount - coins[j], n, coins, memoizingCache) + 1;
if (min > prevMin)
{
min = prevMin;
}
}
}
if (min == int.MaxValue)
{
min = 0;
}
result = min;
memoizingCache.Add(key, result);
return result;
}
//O(amount * n^n) without memoization?
//O(amount * n) with memoization
private static int MaxCoinChangeRecursive(int amount, int n, int[] coins, Dictionary<int, int> memoizingCache)
{
var key = amount;
if (memoizingCache.ContainsKey(key))
{
return memoizingCache[key];
}
int result;
//no coins to pick from
if (amount <= 0 || n < 0)
{
result = 0;
}
var max = 0;
for (int j = 0; j < n; j++)
{
//if this coin size is greater than the sum skip it; no use of this coin
if (coins[j] <= amount)
{
var prevMax = MaxCoinChangeRecursive(amount - coins[j], n, coins, memoizingCache) + 1;
if (max < prevMax)
{
max = prevMax;
}
}
}
result = max;
memoizingCache.Add(key, result);
return result;
}
}
}