问题描述
小R住在一个名为 X 国的国家,这里的货币非常特殊,面值为 V0,V1,V2,...,VnV0,V1,V2,...,Vn,并且 nn 可以无限大。该国的交易规则也很特别:在一次交易中,双方只能对每种面值的货币使用不超过两次。
例如,小R想买一件价格为
198的物品,货币的基数 V=10V=10 时,小R可以使用 2 张 100(102)100(102) 的纸币,卖家则找回 2 张 1(100)1(100) 的纸币。由于这个奇怪的规则,很多 X 国人都无法快速判断某个物品是否可以用这种方式交易成功,他们常常会请聪明的你来帮助。你能帮他们判断一下,是否能按照规则用给定的货币面值 VV 来完成价格为 WW 的交易吗?
测试样例
样例1:
输入:
V = 10,W = 9
输出:'YES'
解题思路
本题采用了递归的思想来解决是否能按照特殊规则完成交易的问题。核心思路是对于给定的货币面值 V 和交易价格 W,依次尝试使用不同张数的当前面值货币后,看剩余的价格能否通过后续的货币组合来完成交易,这个过程通过不断递归调用自身函数来模拟各种可能的货币使用情况,直到能够确定是否可以达成交易(当价格减为 0 时,说明可以达成,出现不合理情况如价格小于 0 或货币面值为 0 说明无法达成)。
因此本题我们可以分为两大步骤:
1.边界条件判断:
首先判断如果交易价格 W 等于 0,这意味着已经成功凑出了所需的价格,按照规则可以完成交易,直接返回 "YES"。
接着判断如果货币面值 V 等于 0(即没有可用的货币了)或者交易价格 W 小于 0(表示在尝试某种货币使用组合后出现了不合理的情况,比如用多了货币导致价格变成负数了),此时无法按照规则完成交易,返回 "NO"。
2.递归尝试不同货币使用张数情况:
先尝试使用 0 张当前面值货币,即直接递归调用 solution(V, W),这相当于在不使用当前面值货币的情况下,看剩余价格能否通过后续的货币组合完成交易。如果这个递归调用返回的结果是 "YES",说明找到了一种可行的交易方式,直接将这个结果返回,表示可以按照规则完成交易。
若使用 0 张当前面值货币不行,接着尝试使用 1 张当前面值货币,通过递归调用 solution(V, W - V) 来模拟使用了 1 张面值为 V 的货币后的情况,此时交易价格变为 W - V,然后同样判断这个递归调用返回的结果,如果是 "YES",就返回 "YES",表示找到了可行的交易方式。
如果使用 1 张当前面值货币也不行,最后尝试使用 2 张当前面值货币,再次递归调用 solution(V, W - 2 * V),交易价格变为 W - 2 * V,这次直接返回这个递归调用的结果,不管是 "YES" 还是 "NO",因为已经尝试完了当前面值货币所有可能的使用张数情况。
主要代码为:
通过上述代码实现的 solution 函数,利用递归方式模拟了在特殊货币交易规则下,对不同面值货币各种使用张数的尝试过程,用来判断能否按照规则完成给定价格的交易。边界条件的判断确保了在合理与不合理情况下能正确返回相应结果,递归调用则逐步探索所有可能的货币组合情况。适合解决根据特定规则判断能否达成某种目标的组合问题。