三种面额纸币正好付款的O(1)复杂度函数问题-java

现有i张十元纸币,k张五元纸币,j张两元纸币,购物后要支付n元(i,j,k,n 为整数)。要求编写一个复杂度为O(1)的函数find_solution(i,j,k, n),功能是计算出能否用现在手上拥有的纸币是否足够并能刚好拼凑齐n元,而不需要找零。

 

/**
 * 
 * @author liliang
 *
 */
public class Find {
    
    /**
     * 
     * @param i 10元张数
     * @param j 5元张数
     * @param k 2元张数
     * @param n     找零数
     */
    public static void FindSolution(int i,int j,int k,int n) {
        if(i<0 || j<0 ||k<0 || n<0) {
            System.out.println("请输入正整数");
            return;
        }
        
        int sum_money = i*10 + j*5 + k*2;//拥有总金额
        //拥有总金额小于找零金额
        if(sum_money < n) {
            System.out.println("不能刚好凑齐"+n+"元");
            return;
        }
        
        int money = n;
        //System.out.println("需要找零: " + money);
        int[] moneyLevel = {2, 5, 10};
        int[] cou = {0,0,0};//张数数组
        
        int cou_index = 0;
        for (int index = moneyLevel.length - 1; index >= 0; index--) {
            int num = money/ moneyLevel[index];//取整
            int mod = money % moneyLevel[index];//余数
            
            if(moneyLevel[index] == 10) {
                if(num > i) {
                    num = i;
                    mod = money - 10*num;//余额
                }
            }else if(moneyLevel[index] == 5) {
                if(num > j) {
                    num = j;
                    mod = money - 10*num;//余额
                }
            }
            else if(moneyLevel[index] ==2) {
                if(num > k) {
                    num = k;
                }
            }
            money = mod;//剩余钱,遍历下一轮
            if (num > 0) {
                //System.out.println("需要" + num + "张" + moneyLevel[index] + "块的");
                cou[cou_index] = num;
            }
            cou_index ++;
        }
        //System.out.println("cou[0]:"+cou[0]+" cou[1]:"+cou[1]+" cou[2]:"+cou[2]);
        
        int res = cou[0]*10 +cou[1]*5+cou[2]*2;
        //System.out.println(res);
        if(res == n) {
            System.out.println("使用"+cou[0]+"张10元,"+cou[1]+"张5元,"+cou[2]+"张2元,刚好凑齐"+n+"元");
        }else {
            System.out.println("不能刚好凑齐"+n+"元");
        }
        
        
    }

    public static void main(String[] args) {
        FindSolution(10,1,2,2);
    }

}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ErekSZ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值