回溯法解n纸币凑数问题

本文介绍了一种使用回溯法解决n张面值不等的纸币凑数问题的方法。与0-1背包问题不同,此问题寻找所有可能的组合,使得纸币面值之和等于给定的值。通过一个名为Select的递归函数,根据当前选择的纸币面值和目标值进行判断,选择或不选择当前纸币,逐步构建所有可行解。回溯法确保了所有解的完整枚举,并且整个过程形成一棵满二叉树,解的数量为2^(n-1)。

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

前言:我们都知道动态规划算法的一个经典案例是0-1背包问题。其中这个问题求的是最优解(即最大解)。然后现在有这么一种情况:设有n张面值不一定相等的纸币,其面值为Vi(0<=i<=n-1),随意输入一个值val,(0<=val<=ΣVi),是否可以通过选择m张纸币使得它们的面值之和为val.即存在解Xi序列(X0,X1,X2,...,Xn)不为0序列。

举个栗子:

现在有6张纸币。其面值Vi序列为(1,1,5,10,20,50).要输入一个val,其中val满足不等式0<=val<=87.(87为这6张纸币面值之和)。设Xi序列为问题的解,其中Xi的取值代表是否选择该纸币,比如,X0=1表示选择第1个纸币,其面值V0=1;X4=1表示选择第5个纸币,其面值V4=为20。若val=6,很明显有两个可行解Xi序列为(1,0,1,0,0,0)、(0,1,1,0,0,0).

现在的这个问题似乎是变形的0-1背包问题,但是似乎求的不是最优解而是所有的可行解,所以这里用解决8皇后问题的经典算法回溯法。

大致思想如下:

假设这么有一个函数Select(i,num),其中i代表当前要进行选择判断的纸币序号。num为当前已选择纸币的总面值。和8皇后问题思路一样,在选择i的时候,其前面i次选择都满足了num<=val这个条件。所以进入这个函数的第一件事就是判断num==val?如果等同,则直接输入Xi序列.如果不等于,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值