Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 2eb2ce3

Browse files
committed
fix: 凑硬币
1 parent a2cd6f6 commit 2eb2ce3

File tree

1 file changed

+17
-24
lines changed

1 file changed

+17
-24
lines changed

动态规划/面试题08.11.硬币.js

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ let waysToChange = function (n) {
88
dp[i] = new Array(n + 1);
99
}
1010

11+
for (let i = 0; i < cl; i++) {
12+
dp[i][0] = 1
13+
}
14+
1115
for (let i = 0; i < dp.length; i++) {
1216
for (let j = 1; j <= n; j++) {
1317
let coin = coins[i];
@@ -17,36 +21,25 @@ let waysToChange = function (n) {
1721

1822
// 考虑加上当前硬币
1923
let pickCurrentAndPrev = 0;
20-
if (j > coin && dpPrev) {
24+
if (j >= coin) {
2125
// 用了当前的硬币以后 剩余的面值
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 ++
26+
let rest = j - coin;
27+
let pickRest = dp[i][rest];
28+
if (pickRest > 0) {
29+
// 这个方式数其实就是凑剩余硬币的方式数
30+
// 比如 以硬币5和面值10来说
31+
// 拿出了5 发现剩余面值是5
32+
// 凑剩余面值5的情况是 5 + 11111
33+
// 所以拿出5来凑的方式是1种
34+
pickCurrentAndPrev = pickRest;
3635
}
3736
}
3837

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;
38+
dp[i][j] = (pickPrev + pickCurrentAndPrev) % 1000000007;
4739
}
4840
}
41+
4942
return dp[cl - 1][n];
5043
};
5144

52-
console.log(waysToChange(61)) // 73
45+
console.log(waysToChange(61)); // 73

0 commit comments

Comments
 (0)