File tree Expand file tree Collapse file tree 1 file changed +52
-0
lines changed Expand file tree Collapse file tree 1 file changed +52
-0
lines changed Original file line number Diff line number Diff line change 1+ let coins = [ 1 , 5 , 10 , 25 ] ;
2+ let waysToChange = function ( n ) {
3+ let cl = coins . length ;
4+ if ( n === 0 ) return 0 ;
5+
6+ let dp = new Array ( cl ) ;
7+ for ( let i = 0 ; i < cl ; i ++ ) {
8+ dp [ i ] = new Array ( n + 1 ) ;
9+ }
10+
11+ for ( let i = 0 ; i < dp . length ; i ++ ) {
12+ for ( let j = 1 ; j <= n ; j ++ ) {
13+ let coin = coins [ i ] ;
14+ let dpPrev = dp [ i - 1 ] ;
15+ // 考虑不用当前硬币
16+ let pickPrev = dpPrev ? dpPrev [ j ] : 0 ;
17+
18+ // 考虑加上当前硬币
19+ let pickCurrentAndPrev = 0 ;
20+ if ( j > coin && dpPrev ) {
21+ // 用了当前的硬币以后 剩余的面值
22+ let duplicate = 1
23+ while ( coin * duplicate < j ) {
24+ let rest = j - coin * duplicate
25+ let pickRest = dpPrev [ rest ] ;
26+ if ( pickRest > 0 ) {
27+ // 这个方式数其实就是凑剩余硬币的方式数
28+ // 比如 以硬币5和面值10来说
29+ // 拿出了5 发现剩余面值是5
30+ // 凑剩余面值5的情况是 5 + 11111
31+ // 所以拿出5来凑的方式是1种
32+ pickCurrentAndPrev += pickRest ;
33+ }
34+
35+ duplicate ++
36+ }
37+ }
38+
39+ let pickOnlyCurrnet = 0 ;
40+ if ( j >= coin ) {
41+ // 除后没有余数 说明是可以只用当前硬币的
42+ // 比如用5凑5 5+5来凑10 用5+5+5凑15
43+ pickOnlyCurrnet = j % coin === 0 ? 1 : 0 ;
44+ }
45+
46+ dp [ i ] [ j ] = ( pickPrev + pickCurrentAndPrev + pickOnlyCurrnet ) % 1000000007 ;
47+ }
48+ }
49+ return dp [ cl - 1 ] [ n ] ;
50+ } ;
51+
52+ console . log ( waysToChange ( 61 ) ) // 73
You can’t perform that action at this time.
0 commit comments