代金券组合(DP)

categories: [计算机通识,数据结构与算法]
thumbnail: /images/fe/offer.jpg
toc: true

代金券组合

假设现有100元的商品,而代金券有50元、30元、20元、5元四种,则最佳优惠是两张50元面额的代金券;而如果现有65元的商品,则最佳优惠是两张30元代金券以及一张5元代金券。
给定目标金额和代金券种类,假设每类代金券数量无限多,求可以满足目标金额所需的最少代金券数量。如果没有任何组合可以满足,则输出Impossible

思路:这道题也是一个动态规划题。但是我那道题之后第一想法并没有想到动态规划,而是使用的递归查找,时间复杂度为O(n^2),于是在线提交时直接tle了。
递归查找的思路很简单,就是设置一个栈保存当前递归的路径,然后每一次递归都分别把所有代金券压入栈去试,如果压入栈后找到了符合的那么就保存当前栈内的路径。如果压入栈后不满足,那么就递归查找。

代码如下:

//money目标金额
//arr代金券数组
//stack当前遍历路径
//res结果数组,最终要在里面选最小的
//current
let min = Number.MAX_VALUE
function getmax(money, arr, stack, res, current){
   
    let currentnum = current + (stack.length === 0 ? 0 : stack
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值