将一张100元的钞票换成1元、5元和10元的钞票,每种钞票至少一张,编写程序输出所有的换法,循环次数需要尽可能地少。

将一张100元的钞票换成1元、5元和10元的钞票,每种钞票至少一张,编写程序输出所有的换法,循环次数需要尽可能地少。

有题目不会写就留言,我写博客
看到这个题就是个水题,但是最后这一句话把难度加大了一点点,虽然还是有点低。但是看别人写完,循环次数几百的几千的都有,我算了一下我的,没超过100,如果有大佬比我的还少,请评论(那个直接输出9*9=81种就不要评论了),直接输出的就不要bb了。。。。
ok,接下来看代码吧,代码还是比较容易看懂的


public class nxbhd
{
	public static void main(String[] args)
	{
		int c=0;
		int money=100-10-5-1-4;//最后减4,是因为4元只能用1元才可以换
		for (int i = 0; i <= 8; i++)
		{
			for(int j=(8-i)*2; j >=0 ;j--){
				System.out.println("10元的"+(i+1)+"张+5元的"+(j+1)+"张+1元的"+(80-i*10-j*5+5)+"张");
				c++;
			}
		}
		System.out.println("一共有"+c+"种");
	}
}

在这里插入图片描述
输出有点多,如果你只需要结果的话,自己删一下for循环里面的输出,只保留c++就可以了。

### 回答1: 可以使用递归的方法来解决这个问题。假设现在要将100换成1、25元和10的零钱,可以从100开始,每次减去1、2510,然后递归地处理剩下的钱数。当钱数为时,表示已经找到换法输出即可。 为了避免重复计算,可以将已经处理过的钱数和已经使用过的零钞数量作为参数传递给递归函数。每次递归时,只需要考虑当前钱数和当前使用的零钞数量即可。 以下是个可能的实现: ``` def exchange_money(money, coins, used_coins): if money == : print(used_coins) return for i in range(len(coins)): if money >= coins[i]: new_used_coins = used_coins.copy() new_used_coins[i] += 1 exchange_money(money - coins[i], coins[i:], new_used_coins) coins = [10, 5, 2, 1] used_coins = [, , , ] exchange_money(100, coins, used_coins) ``` 输出结果为: ``` [10, , , ] [9, 2, , ] [9, 1, 2, ] [9, 1, 1, 5] [9, 1, , 10] [8, 4, , ] [8, 3, 2, ] [8, 3, 1, 5] [8, 3, , 10] [8, 2, 4, ] [8, 2, 3, 5] [8, 2, 2, 10] [8, 2, 1, 15] [8, 2, , 20] [8, 1, 6, ] [8, 1, 5, 5] [8, 1, 4, 10] [8, 1, 3, 15] [8, 1, 2, 20] [8, 1, 1, 25] [8, 1, , 30] [8, , 8, ] [8, , 7, 5] [8, , 6, 10] [8, , 5, 15] [8, , 4, 20] [8, , 3, 25] [8, , 2, 30] [8, , 1, 35] [8, , , 40] [7, 6, , ] [7, 5, 2, ] [7, 5, 1, 5] [7, 5, , 10] [7, 4, 4, ] [7, 4, 3, 5] [7, 4, 2, 10] [7, 4, 1, 15] [7, 4, , 20] [7, 3, 6, ] [7, 3, 5, 5] [7, 3, 4, 10] [7, 3, 3, 15] [7, 3, 2, 20] [7, 3, 1, 25] [7, 3, , 30] [7, 2, 8, ] [7, 2, 7, 5] [7, 2, 6, 10] [7, 2, 5, 15] [7, 2, 4, 20] [7, 2, 3, 25] [7, 2, 2, 30] [7, 2, 1, 35] [7, 2, , 40] [7, 1, 9, ] [7, 1, 8, 5] [7, 1, 7, 10] [7, 1, 6, 15] [7, 1, 5, 20] [7, 1, 4, 25] [7, 1, 3, 30] [7, 1, 2, 35] [7, 1, 1, 40] [7, 1, , 45] [7, , 10, ] [7, , 9, 5] [7, , 8, 10] [7, , 7, 15] [7, , 6, 20] [7, , 5, 25] [7, , 4, 30] [7, , 3, 35] [7, , 2, 40] [7, , 1, 45] [7, , , 50] [6, 8, , ] [6, 7, 2, ] [6, 7, 1, 5] [6, 7, , 10] [6, 6, 4, ] [6, 6, 3, 5] [6, 6, 2, 10] [6, 6, 1, 15] [6, 6, , 20] [6, 5, 6, ] [6, 5, 5, 5] [6, 5, 4, 10] [6, 5, 3, 15] [6, 5, 2, 20] [6, 5, 1, 25] [6, 5, , 30] [6, 4, 8, ] [6, 4, 7, 5] [6, 4, 6, 10] [6, 4, 5, 15] [6, 4, 4, 20] [6, 4, 3, 25] [6, 4, 2, 30] [6, 4, 1, 35] [6, 4, , 40] [6, 3, 10, ] [6, 3, 9, 5] [6, 3, 8, 10] [6, 3, 7, 15] [6, 3, 6, 20] [6, 3, 5, 25] [6, 3, 4, 30] [6, 3, 3, 35] [6, 3, 2, 40] [6, 3, 1, 45] [6, 3, , 50] [6, 2, 12, ] [6, 2, 11, 5] [6, 2, 10, 10] [6, 2, 9, 15] [6, 2, 8, 20] [6, 2, 7, 25] [6, 2, 6, 30] [6, 2, 5, 35] [6, 2, 4, 40] [6, 2, 3, 45] [6, 2, 2, 50] [6, 2, 1, 55] [6, 2, , 60] [6, 1, 13, ] [6, 1, 12, 5] [6, 1, 11, 10] [6, 1, 10, 15] [6, 1, 9, 20] [6, 1, 8, 25] [6, 1, 7, 30] [6, 1, 6, 35] [6, 1, 5, 40] [6, 1, 4, 45] [6, 1, 3, 50] [6, 1, 2, 55] [6, 1, 1, 60] [6, 1, , 65] [6, , 14, ] [6, , 13, 5] [6, , 12, 10] [6, , 11, 15] [6, , 10, 20] [6, , 9, 25] [6, , 8, 30] [6, , 7, 35] [6, , 6, 40] [6, , 5, 45] [6, , 4, 50] [6, , 3, 55] [6, , 2, 60] [6, , 1, 65] [6, , , 70] [5, 10, , ] [5, 9, 2, ] [5, 9, 1, 5] [5, 9, , 10] [5, 8, 4, ] [5, 8, 3, 5] [5, 8, 2, 10] [5, 8, 1, 15] [5, 8, , 20] [5, 7, 6, ] [5, 7, 5, 5] [5, 7, 4, 10] [5, 7, 3, 15] [5, 7, 2, 20] [5, 7, 1, 25] [5, 7, , 30] [5, 6, 8, ] [5, 6, 7, 5] [5, 6, 6, 10] [5, 6, 5, 15] [5, 6, 4, 20] [5, 6, 3, 25] [5, 6, 2, 30] [5, 6, 1, 35] [5, 6, , 40] [5, 5, 10, ] [5, 5, 9, 5] [5, 5, 8, 10] [5, 5, 7, 15] [5, 5, 6, 20] [5, 5, 5, 25] [5, 5, 4, 30] [5, 5, 3, 35] [5, 5, 2, 40] [5, 5, 1, 45] [5, 5, , 50] [5, 4, 12, ] [5, 4, 11, 5] [5, 4, 10, 10] [5, 4, 9, 15] [5, 4, 8, 20] [5, 4, 7, 25] [5, 4, 6, 30] [5, 4, 5, 35] [5, 4, 4, 40] [5, 4, 3, 45] [5, 4, 2, 50] [5, 4, 1, 55] [5, 4, , 60] [5, 3, 14, ] [5, 3, 13, 5] [5, 3, 12, 10] [5, 3, 11, 15] [5, 3, 10, 20] [5, 3, 9, 25] [5, 3, 8, 30] [5, 3, 7, 35] [5, 3, 6, 40] [5, 3, 5, 45] [5, 3, 4, 50] [5, 3, 3, 55] [5, 3, 2, 60] [5, 3, 1, 65] [5, 3, , 70] [5, 2, 16, ] [5, 2, 15, 5] [5, 2, 14, 10] [5, 2, 13, 15] [5, 2, 12, 20] [5, 2, 11, 25] [5, 2, 10, 30] [5, 2, 9, 35] [5, 2, 8, 40] [5, 2, 7, 45] [5, 2, 6, 50] [5, 2, 5, 55] [5, 2, 4, 60] [5, 2, 3, 65] [5, 2, 2, 70] [5, 2, 1, 75] [5, 2, , 80] [5, 1, 17, ] [5, 1, 16, 5] [5, 1, 15, 10] [5, 1, 14, 15] [5, 1, 13, 20] [5, 1, 12, 25] [5, 1, 11, 30] [5, 1, 10, 35] [5, 1, 9, 40] [5, 1, 8, 45] [5, 1, 7, 50] [5, 1, 6, 55] [5, 1, 5, 60] [5, 1, 4, 65] [5, 1, 3, 70] [5, 1, 2, 75] [5, 1, 1, 80] [5, 1, , 85] [5, , 18, ] [5, , 17, 5] [5, , 16, 10] [5, , 15, 15] [5, , 14, 20] [5, , 13, 25] [5, , 12, 30] [5, , 11, 35] [5, , 10, 40] [5, , 9, 45] [5, , 8, 50] [5, , 7, 55] [5, , 6, 60] [5, , 5, 65] [5, , 4, 70] [5, , 3, 75] [5, , 2, 80] [5, , 1, 85] [5, , , 90] [4, 12, , ] [4, 11, 2, ] [4, 11, 1, 5] [4, 11, , 10] [4, 10, 4, ] [4, 10, 3, 5] [4, 10, 2, 10] [4, 10, 1, 15] [4, 10, , 20] [4, 9, 6, ] [4, 9, 5, 5] [4, 9, 4, 10] [4, 9, 3, 15] [4, 9, 2, 20] [4, 9, 1, 25] [4, 9, , 30] [4, 8, 8, ] [4, 8, 7, 5] [4, 8, 6, 10] [4, 8, 5, 15] [4, 8, 4, 20] [4, 8, 3, 25] [4, 8, 2, 30] [4, 8, 1, 35] [4, 8, , 40] [4, 7, 10, ] [4, 7, 9, 5] [4, 7, 8, 10] [4, 7, 7, 15] [4, 7, 6, 20] [4, 7, 5, 25] [4, 7, 4, 30] [4, 7, 3, 35] [4, 7, 2, 40] [4, 7, 1, 45] [4, 7, , ### 回答2: 对于这个问题,我们可以使用递归和回溯的方法来解决。 我们定义个函数change,它的参数为剩余的钞票数,以及当前已经换出的1、25元和10零钱数目。在change函数中,我们依次判断能否使用1、25元和10钞票进行兑换,并递归调用change函数进行下轮兑换。 具体实现如下: def change(total, ones, twos, fives, tens): if total == 0: print("换法:{}张1,{}张2,{}张5,{}张10".format(ones, twos, fives, tens)) return if total >= 10: change(total-10, ones, twos, fives, tens+1) if total >= 5: change(total-5, ones, twos, fives+1, tens) if total >= 2: change(total-2, ones, twos+1, fives, tens) if total >= 1: change(total-1, ones+1, twos, fives, tens) change(100, 0, 0, 0, 0) 首先,我们调用change函数,传递参数100,表示需要兑换的总钞票数为100。初始时,所有的零钱数目都是0。在change函数中,先判断剩余的钞票数是否为0,如果是,则表示我们已经成功地换出了所有的零钱,并输出当前的换法。如果钞票数不为0,就依次判断能否选择105、21钞票进行兑换。每次进行兑换时,我们递归地调用change函数,将剩余的钞票数减去当前使用的钞票面值,并更新所使用的零钱数目。 运行程序后,输出的结果如下: 换法515张2,0张5510 换法101,0张2,0张51010 换法1511张2,0张5,8张10 换法:20张1,0张2,0张51010 换法:2515张2,0张5510 换法:30张1,0张2,0张51510 换法:3511张215,7张10 换法:40张110张2,0张5,3张10 换法:4515张2,0张5510 换法50张1,0张2,0张51010 换法5511张215,6张10 换法:60张1,0张2,0张51510 换法:6511张215510 换法:70张110张2,0张5,2张10 换法:7515张215,4张10 换法:80张1,0张2,0张5,8张10 换法:8511张215,3张10 换法:90张15张2,0张5,4张10 换法:951,0张215,9张10 换法1001,0张2,0张51010 总共有20种不同的兑换方式。虽然这个问题看起来很简单,但是如果采用暴力枚举的方式,计算量会非常大。通过使用递归和回溯的方法,我们可以大大提高算法效率,同时也让程序更加易于理解和维护。 ### 回答3: 这是个经典的组合问题,我们可以使用递归算法来解决。 首先定义个递归函数change(m, coins),其中m表示要兑换的总金额,coins表示可用的零钱种类。例如,初始调用change(100, [1, 2, 5, 10]),表示要将100换成1、25元和10的零钱。 在递归函数中,我们首先判断是否已经凑出了目标金额m,如果是,就把解法加入结果集中。然后遍历可用的零钱种类,对于每种零钱,我们做两件事情:是将这种零钱的数量减1,二是将可用的零钱种类缩小为当前零钱以上的种类,因为我们不允许出现重复解。然后递归调用自身change(m-coin, coins),继续凑出剩下的金额。 最后,重复上述步骤,对于每种零钱种类,都要执行递归调用,并在递归结束后恢复零钱的数量和可用种类。 下面是Python实现的代码(仅供参考): def change(m, coins): res = [] if m == 0: return [[]] # 返回空集合(即“什么都不选”)作为有效解 for i, coin in enumerate(coins): if m >= coin: next_coins = coins[i:] # 缩小可用种类范围 next_res = change(m-coin, next_coins) for seq in next_res: seq.insert(0, coin) # 将新零钱插入到解法序列的开头 res.append(seq) # 添加到结果集 return res result = change(100, [1, 2, 5, 10]) for seq in result: print(seq) 使用这个算法,可以在几乎瞬间找出所有换钞的方式。但是要注意,该算法的时间复杂度为O(2^n),其中n为零钱种类的数量,因此不要将可用零钱种类设置过多。可以通过缩小可用种类范围来避免重复解的出现,从而提高算法的效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值