算法系列之住酒店最少天数问题

算法描述:预算N,酒店数M,数组存储每个酒店单晚的价格,求最少能住的天数
示例:预算1000,酒店3,分别是300,600,2的价格,最少能住52天

暴力解决:

function toTheMin(n,m,arr,res) {
    var valueList = arr,
        budget = n,
        num = m,
        flag = 0;
    for(var i = 0, l = valueList.length; i < l; i++) {
        if(valueList[i] <= budget && (valueList[i + 1] > budget) || (i == l - 1)) {
            flag = 1;
            var min = Math.floor(budget / valueList[i]);
            budget = budget - min * valueList[i];
            if(budget < valueList[0]) {
                var res = min + res;
                return res;
            }else {
                return toTheMin(budget, i+1, valueList.slice(0,i), min+res);
            }
        }
    }
    if(flag == 0) {
        return 0;
    }      
}
var arr = [300, 600, 200];
var list = arr.sort(function(a, b) {
    return a - b;
});
var num = list.length;
toTheMin(1000, num, list, 0);

dp实现

function toTheMin2(n,m,arr) {
    var dp = {0:0};
    for(var i = m; i >= 0; i--){
        for(var j = arr[i]; j <= n; j++){
            if(dp[j-arr[i]] != undefined){
                if(dp[j] == undefined) {
                    dp[j] = dp[j-arr[i]] + 1;
                }else{
                    dp[j] = Math.min(dp[j], dp[j-arr[i]] + 1);
                }
            }
        }
    }
    return dp[n];
}

用benchmark跑了一下,暴力解决貌似要快点?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值