类型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),问:你要给用户找零钱,问:至少要多少张纸币?(这部分之后补充)