题意: 小明要买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<right?left+1:right+1
}
}