百元买百鸡问题

一、假设公鸡2元一只,母鸡1.5元一只,小鸡0.5元一只,现用100元买一百只鸡。

解决方案一:枚举法

把每一种情况都罗列出来,找出符合条件的情况。

        int x,y,z;
        int times = 0;
        int index = 1;
        for (x = 0;x <= 100;x++){
            for (y = 0; y <= 100;y++){
                for (z = 0;z <= 100;z++){
                    times++;
                    if (x + y + z == 100 && 2*x +1.5*y + 0.5*z == 100){
                        System.out.println("方案"+index+": 公鸡:"+x+"只 母鸡:"+y+"只 小鸡:"+z+"只");
                        index++;
                    }
                }
            }
        }
        System.out.println("总共循环了"+times+"次");

1.优化1.0版

  • 利用x+y+z=100解出z=100-x-y,减少一层循环。

        int x,y,z;
        int times = 0;
        int index = 1;
        for (x = 0;x <= 100;x++){
            for (y = 0; y <= 100;y++){
                z = 100 - x - y;
                times++;
                if (x + y + z == 100 && 2*x +1.5*y + 0.5*z == 100){
                    System.out.println("方案"+index+": 公鸡:"+x+"只 母鸡:"+y+"只 小鸡:"+z+"只");
                    index++;
                }
            }
        }
        System.out.println("总共循环了"+times+"次");

2. 优化2.0版

  • 方程一:100 = x+ y +z

  • 方程二:100 = 2*x+1.5y+0.5z 200 = 4*x + 3*y + z

根据方程一和方程二推出方程三:100 = 3*x+2*y y = (100-3*x)/2 ,由此得知x只能取偶数,而且最大为32。

        int x,y,z;
        int times = 0;
        int index = 1;
        for (x = 0;x <= 32;x+=2){
            y = (100 - 3*x)/2;
            z = 100 - x - y;
            times++;
            if (x + y + z == 100 && 2*x +1.5*y + 0.5*z == 100){
                System.out.println("方案"+index+": 公鸡:"+x+"只 母鸡:"+y+"只 小鸡:"+z+"只");
                index++;
            }
        }
        System.out.println("总共循环了"+times+"次");
总结:根据题目设未知数并列出方程,三个变量x,y,z,两个方程,只有两个变量被约束,一个变量自由,所以得出至少一层循环。