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