编程算法 - 买n个橘子 [贪心算法](js)

题意: 小明要买n个橘子,但超市只有“1袋6个橘子”和“1袋8个橘子”的包装(不能拆开),请问小明购买n个橘子至少买多少袋?若无论怎么组合都不能恰好达到n,则返回 -1

例题:
输入20,返回3
输入10,返回-1

思路: 这类问题是贪心算法。其实画二叉树分析可以简单得出结论:

画二叉树分析

因此结论为:
买n个橘子的袋数 = 买(n-6)个橘子的袋数 & 买(n-8)个橘子的袋数 的较小值 + 1

即:[buy(n)] = [buy(n-6)]<[buy(n-8)] ? [buy(n-6)]:[buy(n-8)] + 1

JS代码如下:

var readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
rl.on('line',function(line){
    let n = parseInt(line.trim());
    let result = buy(n)
    console.log(result)
})
function buy(n){
    if(n===0){
        return 0
    }
    if(n<0){
        return -1
    }
    let left = buy(n-6)
    let right = buy(n-8)
    if(left<0&&right<0){
        return -1
    }else if(left<0){
        return right+1
    }else if(right<0){
        return left+1
    }else{  //left>0,right>0
        return left

你可能感兴趣的:(编程算法 - 买n个橘子 [贪心算法](js))