现有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);
}
}