Java 显示等于X的所有硬币组合(四分之一、一角、五分、一便士)

Java 显示等于X的所有硬币组合(四分之一、一角、五分、一便士),java,Java,编写一个程序,要求用户输入美元金额X。显示所有硬币的组合quarter、dime、nickel、penny等于X。输入美元金额$:1.2 4 quarter、2 dime、0 nickel、0 penny 3 quarter、4 dime、1 nickel、0 penny package p1; public class Combination { public static void findCombination(Double value){ int total

编写一个程序,要求用户输入美元金额X。显示所有硬币的组合quarter、dime、nickel、penny等于X。输入美元金额$:1.2 4 quarter、2 dime、0 nickel、0 penny 3 quarter、4 dime、1 nickel、0 penny

package p1;

public class Combination {

    public static void findCombination(Double value){

        int totalCents = (int) (value*100);

        int aq = totalCents/25;
        int ad = totalCents/10;
        int an = totalCents/5;
        int ap = totalCents;

        for(int q=0; q<= aq; q++){

            for(int d=0; d<= ad; d++){

                for(int n=0;n<= an; n++){

                    for(int p=0;p<=ap; p++){

                        if(((q*25) + (d*10) + (n*5) + p ) == totalCents){

                            System.out.println("Q: "+q+" D: "+d+" N: "+n+" P: "+p );

                        }
                    }
                }
            }
        }

有没有比这更优化的解决方案,我想不出了。

您可以编辑for循环布尔值中使用的最大值。也许会把订单翻过来

比如:

int p=0, n=0, d=0, q=0;
for(p=0; p <= (totalcents-q*25-d*10-n*5) ; p++){

    for(n=0; (n*5) <= (totalcents-q*25-d*10) ; n++){

        for(d=0; (d*10) <= (totalcents-q*25) ; d++){

            for(q=0; (q*25) <= totalcents ; q++){

                if(((q*25) + (d*10) + (n*5) + p ) == totalCents){

                    System.out.println("Q: "+q+" D: "+d+" N: "+n+" P: "+p );

                }
            }
        }
    }
}

如果你的代码可以工作,你可以将它发布到CodeReview。这种类型的事情属于可以通过动态编程优化的问题类型,以减少重叠的工作,因此它只能完成一次。请参阅:。在定义q、d和n之前,您正在使用它们。也许你输入了一个错误?但是现在你把顺序翻转得太厉害了,以至于你不得不回到过去为过去计算过的表达式提供值。我试着提前考虑代码在翻转顺序运行时会做什么,但它似乎最终会做同样的过程,开始速度很快,到达美分时速度会变慢。我不能100%确定哪个订单更快,所以你应该测试一下。但是,更改for循环的最大值肯定会减少runtime@harold。
int aq = totalCents/25;
int ad = totalCents/10;
int an = totalCents/5;
int ap = totalCents;