編寫一個函數用於實現金額組合:面額分別有1元、2元、5元的紙幣共計N張,現需要付出M元,統計共有幾種付法。N、M是用戶輸入的值。(有10張紙幣,面額分別是1元、2元、5元,現需要付出18元,通過編程統計出共有幾種付法。)
思考:JS中for循環嵌套有什麼特點?
參考代碼:
方案1:
/* 設1元a張,2元b張,5元c張
*/
function f(N, M) {
var arr = [];
for (var a = 0; a <= N; a++) {
for (var b = 0; b <= N; b++) {
for (var c = 0; c <= N; c++) {
if (a + 2 * b + 5 * c == M && a + b + c == N) {
arr.push(a + ',' + b + ',' + c);
};
}
}
}
if (arr.length == 0) {
console.log("無解");
} else {
console.log(arr);
}
}
f(10, 23);//=>["2,8,0", "5,4,1", "8,0,2"]
方案2
/* 轉換爲數學問題
設1元a張,2元b張,5元c張,列出方程組
a+b+c=N
a+2b+5c=M
獲得關係式
b+4c=M-N
0≤N - b - c
(M-N)爲常數,因此問題本質是用JS解決一個一元一次直線方程在限定範圍內的非負整數解,類似線性規劃的非負整數解。
*/
function f1(N, M) {
var arr = [];
for (var b = 0; b <= M - N; b++) {
for (var c = 0; c <= M - N; c++) {
var a = N - b - c;
if (b + 4 * c == M - N) {
if (a >= 0) {
arr.push(a + ',' + b + "," + c);
}
}
}
}
if (arr.length !== 0) {
console.log(arr);
} else {
console.log("無解");
}
}
f1(10, 18); //=>["8,0,2", "5,4,1", "2,8,0"]