File tree Expand file tree Collapse file tree 2 files changed +83
-0
lines changed Expand file tree Collapse file tree 2 files changed +83
-0
lines changed Original file line number Diff line number Diff line change
1
+
2
+ export interface CoinChange {
3
+ minCoins : number ,
4
+ coins : number [ ]
5
+ }
6
+
7
+ /**
8
+ * Given a set of categories of coins C and an amount of money S, the goal is:
9
+ * to give change for S but to use a minimum number of coins. Suppose each category of coin has an infinite number of pieces.
10
+ * @param money - amon of money.
11
+ * @param coins - The coins that are available.
12
+ * @returns CoinChange, the minimum number of coins, and which coins are selected
13
+ */
14
+ export const coinChange = ( money : number , coins : number [ ] ) : CoinChange => {
15
+
16
+ const minCoins : number [ ] = Array ( money + 1 ) . fill ( Infinity ) ;
17
+ const lastCoin : number [ ] = Array ( money + 1 ) . fill ( - 1 ) ;
18
+
19
+ minCoins [ 0 ] = 0 ;
20
+
21
+ // Fill in the DP table
22
+ for ( let i = 0 ; i < coins . length ; i ++ ) {
23
+ for ( let j = 0 ; j <= money ; j ++ ) {
24
+ if ( j >= coins [ i ] ) {
25
+ if ( minCoins [ j ] > 1 + minCoins [ j - coins [ i ] ] ) {
26
+ minCoins [ j ] = 1 + minCoins [ j - coins [ i ] ] ;
27
+ lastCoin [ j ] = coins [ i ] ;
28
+ }
29
+ }
30
+ }
31
+ }
32
+
33
+ const res : CoinChange = {
34
+ minCoins : minCoins [ money ] ,
35
+ coins : [ ]
36
+ }
37
+
38
+ let total : number = money ;
39
+ while ( total > 0 ) {
40
+ res . coins . push ( lastCoin [ total ] ) ;
41
+ total -= lastCoin [ total ] ;
42
+ }
43
+
44
+ return res ;
45
+ }
46
+
Original file line number Diff line number Diff line change
1
+ import { CoinChange , coinChange } from "../coin_change" ;
2
+
3
+
4
+ interface TestCase {
5
+ money : number ,
6
+ coins : number [ ] ,
7
+ expected : CoinChange
8
+ }
9
+
10
+ const cases : TestCase [ ] = [
11
+ {
12
+ money : 13 ,
13
+ coins : [ 7 , 2 , 3 , 6 ] ,
14
+ expected : {
15
+ minCoins : 2 ,
16
+ coins : [ 6 , 7 ]
17
+ }
18
+ } ,
19
+ {
20
+ money : 10 ,
21
+ coins : [ 1 , 5 ] ,
22
+ expected : {
23
+ minCoins : 2 ,
24
+ coins : [ 5 , 5 ]
25
+ }
26
+ }
27
+ ] ;
28
+
29
+ describe ( "Coin Change Algorithm Test" , ( ) => {
30
+ test . each ( cases ) (
31
+ "given money: $money, and coins: $coins the minimum coin change should return $expected" ,
32
+ ( { money, coins, expected} ) => {
33
+ const result = coinChange ( money , coins ) ;
34
+ expect ( result ) . toEqual ( expected ) ;
35
+ }
36
+ ) ;
37
+ } ) ;
You can’t perform that action at this time.
0 commit comments