1元、5元、10元、20元、50元、100元六种面额,输入N,计算有多少种组合可以等于N

有足够多的1元、5元、10元、20元、50元、100元六种面额的纸币,输入N,计算出有多少种组合可以等于N;

如输入N=5,则返回2。因为有两种组合:1+1+1+1+1=5,5=5,即5张1元或者1张5元;

Java代码如下:

public class Test{
public int getGroups(int N){
int round5=(int) Math.floor(N/5); //N除以5并向下取整
int round10=(int) Math.floor(N/10);
int round20=(int) Math.floor(N/20);
int round50=(int) Math.floor(N/50);
int round100=(int) Math.floor(N/100);
int num=0;
if(N>0&&N<5){ //N取值大于0小于5
num=1;
}
if(N>=5&&N<10 && round5>0){ //N取值大于等于5小于10
for(int i5=0;i5<=round5;i5++){
int n5=N-(5*i5);
if(n5>=0){
num=num+1;
}
}}
if(N>=10&&N<20 && round5>0&& round10>0){ //N取值大于等于10小于20
for(int i5=0;i5<=round5;i5++){
for(int i10=0;i10<=round10;i10++){
int n10=N-(5*i5+10*i10);
if(n10>=0){
num=num+1;
}}}}
if(N>=20&&N<50 && round5>0&& round10>0&&round20>0){ //N取值大于等于20小于50
for(int i5=0;i5<=round5;i5++){
for(int i10=0;i10<=round10;i10++){
for(int i20=0;i20<round20;i20++){
int n20=N-(5*i5+10*i10+20*i20);
if(n20>=0){
num=num+1;
}}}}}
if(N>=50&&N<100 && round5>0&& round10>0&&round20>0&&round50>0){ //N取值大于等于50小于100
for(int i5=0;i5<=round5;i5++){
for(int i10=0;i10<=round10;i10++){
for(int i20=0;i20<round20;i20++){
for(int i50=0;i50<round50;i50++){
int n50=N-(5*i5+10*i10+20*i20+50*i50);
if(n50>=0){
num=num+1;
}}}}}}
if(N>=100 && round5>0&& round10>0&&round20>0&&round50>0&&round100>0){ //N取值大于等于100
for(int i5=0;i5<=round5;i5++){
for(int i10=0;i10<=round10;i10++){
for(int i20=0;i20<round20;i20++){
for(int i50=0;i50<round50;i50++){
for(int i100=0;i100<round100;i100++){
int n100=N-(5*i5+10*i10+20*i20+50*i50+100*i100);
if(n100>=0){
num=num+1;
}}}}}}}
return num;
}
public static void main(String[] args){
Test test=new Test();
int num=test.getGroups(4);
System.out.println(num);
}
}

原文地址:https://www.cnblogs.com/shuyichao/p/10475501.html