无限和有限钱币找零问题-java 钱的面值1,2,5,10块

类型1:你有1元,2元,5元,10元种4面值的钱(数量是无限的),问:你要给用户找零时有多少种找法?

思路:可以将其看成一个等式,假设N为要找给用户的钱,那么你就可以进行循环计算赛选出1x+2y+5z+10h=N。赛选出符合这个等式的条件。看代码:

import java.util.*;
public class WirelessMoney {
	public static void main(String []args) {
		WirelessMoney main = new WirelessMoney();
	    int v=main.GiveChargeSum(37);
	    System.out.print(v);
	}
    public int GiveChargeSum (int N) {
        int R= 0;
        int a= N/10;
        int b= N/5;
        int c=N/2;
        for(int x=0;x<=a;x++) {
        	for (int y=0;y<=b;y++) {
        		for(int z=0;z<=c;z++) {
        			for(int m=0;m<=N;m++) {
        				int r=x*10+y*5+2*z+m;     				
        				if(r==N) {
            				R++;
            			}
        			}
        		}
        	}
        }
		return R;     
    }
}

这是目前能想到最容易实现的一种方法,但是时间复杂度比较高(有更好想法的小伙伴可以私信我哦)。

类型二:你有1元,2元,5元,10元种4面值的钱(数量是无限的),问:你要给用户找零钱,问:至少要多少张纸币?

思路:贪心算法(每次给最大的就可以了呗)看代码:

 public int Givemoney(int N) {
    	int number = 0;
		int a =N/10;
		if(a>=0) {//用几张10元
			int money = N - a*10;
			int b = money/5;
			number = number + a;
			if(b>=0) {//用几张5元
				money = money - b*5;
				number = number + b;
				int c= money/2;
				if(c>=1) {//用几张2元
					money = money - c*2;
					number = number + c + money;//这里有多少钱就用几张1元,所有直接加就可以了
				}else {
					number = number + money;
				}
			}
		}
    	
    	return number;  	
    }

注:还有种情况是,将钱币的数值放在数组中,这里对应的钱币数值就直接换成数组下标的值即可。

类型三:你有1元,2元,5元,10元种4面值的钱(数量是有限的分别是 10,3,0,5),问:你要给用户找零钱,问:至少要多少张纸币?(这部分之后补充)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值