Java 算法 换零钞

题目描述

x星球的钞票的面额只有:100元,5元,2元,1元,共4种。

小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱。

小明有点强迫症,他坚持要求200元换出的零钞中2元的张数刚好是1元的张数的10倍,

剩下的当然都是5元面额的。

银行的工作人员有点为难,你能帮助算出:在满足小明要求的前提下,最少要换给他多少张钞票吗?

(5元,2元,1元面额的必须都有,不能是0)

输入

输出
注意,需要提交的是一个整数,不要填写任何多余的内容。

输入样例 1


输出样例 1

注意,需要提交的是一个整数,不要填写任何多余的内容

解题思路

要保证换的张数最少,即先计算能被5整除2元和1元的总和最小为多少,再用剩余的全换5元的就行。

代码

public class Main {
   
   
    static int n4=1
贪心法是一种优化策略,它每次选择当前状态下最优的选择,期望能够得到全局最优解。在这个问题中,我们需要找寻所有将100元转成1元、2元、5元和10元零钱的方式。我们可以编写一个Java程序,采用动态规划的方式来解决: 首先,创建一个二维数组dp[][], 其中dp[i]表示i元可以由哪些组合构成。初始化dp[0]到dp[9]都设为true,表示0到9元都可以通过某种组合达到。 然后,从10元开始遍历到100元,对于每个金额i,检查是否能用小于等于i的最大面额(如5元)去除掉i元,如果可以,则更新dp[i]为dp[j]*dp[i-j],其中j是从最大面额递减到1的值。 最后,当dp[100]为true时,说明有解,我们逆向回溯记录下所有可能的组合。 以下是简单的Java代码实现: ```java public class Change { public static void main(String[] args) { boolean[][] dp = new boolean[101][4]; dp[0] = true; for (int i = 1; i <= 100; i++) { for (int j = 3; j >= 1; j--) { if (i >= 10 && i % 10 == 0) { dp[i] |= dp[i - 10]; } else { dp[i] |= dp[i - (5 * j)]; } } } printChange(dp); } private static void printChange(boolean[][] dp) { int[] coins = {10, 5, 2, 1}; for (int i = 100; i > 0 && dp[i]; i--) { for (int coin : coins) { if (i >= coin) { System.out.println("1 x " + coin + ", "); i -= coin; } } } } } ``` 运行此程序,会输出所有可行的零钱方案。注意这个算法并不是所有情况都能保证最优解,但在这种特定问题上,贪心法给出了有效的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

future furuer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值