代金券组合(DP)

博客讨论了如何在给定商品金额和多种代金券的情况下,通过动态规划算法寻找使用最少代金券数量的最优组合。针对目标金额,利用无限数量的代金券,递归查找和动态规划两种方法被提出,动态规划能有效避免重复计算,提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值