算法题:现有i张十元,k张五元,j张两元,要支付n元(i,j,k,n 为整数)。写一个函数:要求手上拥有的纸币是否足够并能刚好拼凑齐n元,而不需要找零。
直接上代码:
/*
** i: 10元的张数
** j: 5元的张数
** k: 2元的张数
** n: 支付金额
*/
function Changes(i, j, k, n) {
const total = i * 10 + j * 5 + k * 2 //兜里的钱
if (total > n) { //兜里够钱
let remaining = n //剩余的钱
let num10 = 0; //需要十元的张数
let num5 = 0; //需要五元的张数
let num2 = 0; //需要两元的张数
//计算需要十元的数量
if (remaining >= 10 && i > 0) {
min10 = Math.floor(remaining / 10) //全用十元最小支付张数
num10 = Math.min(i, min10) //跟兜里张数对比取最小值
remaining = remaining - num10 * 10 //剩余应支付金额
}
//计算需要五元的数量
if (remaining >= 5 && j > 0) {
min5 = Math.floor(remaining / 5) //剩余应付用五元最小支付张数
num5 = Math.min(j, min5) //跟兜里张数对比取最小值
remaining = remaining - num5 * 5 //剩余应支付金额
}
//计算需要两元的数量
if (remaining >= 2 && k > 0) {
min2 = Math.floor(remaining / 2) //剩余应付用五元最小支付张数
num2 = Math.min(k, min2) //跟兜里张数对比取最小值
remaining = remaining - num2 * 2 //剩余应支付金额
}
//判断是否满足金额
if (remaining === 0) {
console.log(`满足条件,方案为支付:${num10}张十元,${num5}张五元,${num2}张两元`)
} else {
console.log(`钱够,但需找零`)
}
} else { //兜里钱不够
console.log(`兜里不够钱,还差${n-total}元`)
}
}
Changes(1, 1, 1, 27);
增加找零版+建议版
function Changes(i, j, k, n) {
const total = i * 10 + j * 5 + k * 2 //兜里的钱
if (total > n) { //兜里够钱
let remaining = n //剩余的钱
let num10 = 0; //需要十元的张数
let num5 = 0; //需要五元的张数
let num2 = 0; //需要两元的张数
//计算需要十元的数量
if (remaining >= 10 && i > 0) {
const min10 = Math.floor(remaining / 10) //全用十元最小支付张数
num10 = Math.min(i, min10) //跟兜里张数对比取最小值
remaining -= num10 * 10 //remaining = remaining - num10 * 10 //剩余应支付金额
}
//计算需要五元的数量
if (remaining >= 5 && j > 0) {
const min5 = Math.floor(remaining / 5) //剩余应付用五元最小支付张数
num5 = Math.min(j, min5) //跟兜里张数对比取最小值
remaining -= num5 * 5 //剩余应支付金额
}
//计算需要两元的数量
if (remaining >= 2 && k > 0) {
const min2 = Math.floor(remaining / 2) //剩余应付用五元最小支付张数
num2 = Math.min(k, min2) //跟兜里张数对比取最小值
remaining -= num2 * 2 //剩余应支付金额
}
//判断是否满足金额
if (remaining === 0) {
console.log(`满足条件,方案为支付:${num10}张十元,${num5}张五元,${num2}张两元`)
} else {
console.log(`钱够,但需找零`)
// 无法凑齐所需金额,计算找零方案
let changeMoney = n
let change10 = 0;
let change5 = 0;
let change2 = 0;
let returnMoney = 0;
// 计算需要的10元纸币数量
if (changeMoney >= 10 && i > 0) {
const min10 = Math.ceil(changeMoney / 10) //全用十元最小支付张数 向上取整
change10 = Math.min(i, min10);
changeMoney -= change10 * 10;
}
// 计算需要的五元纸币数量
if (changeMoney >= 5 && k > 0) {
const min5 = Math.ceil(changeMoney / 5)
change5 = Math.min(k, min5);
changeMoney -= change5 * 5;
}
// 计算需要的两元纸币数量
if (changeMoney >= 2 && j > 0) {
const min2 = Math.ceil(changeMoney / 2)
change2 = Math.min(j, min2);
changeMoney -= change2 * 2;
}
returnMoney = Math.abs(changeMoney)
console.log(
`身上钱币没有最佳组合只有找零方案,方案是:需要${change10}张十元纸币,${change5}张五元纸币,${change2}张两元纸币,找零${returnMoney}`)
}
} else { //兜里钱不够
console.log(`兜里不够钱,还差${n-total}元`)
// 如果手上的钱不够支付
let num10 = Math.floor(n / 10); // 计算需要的十元纸币数量
n -= num10 * 10;
let num5 = Math.floor(n / 5); // 计算需要的五元纸币数量
n -= num5 * 5;
let num2 = Math.floor(n / 2); // 计算需要的两元纸币数量
console.log(
`需要${num10}张十元纸币,${num5}张五元纸币,${num2}张两元纸币,刚好可凑齐${num10 * 10 + num5 * 5 + num2 * 2}元(假设有无限张)`);
}
}
Changes(4, 0, 1, 27);