天天看点

百元买百鸡的算法优化

百元买百鸡的算法优化

首先我们来描述一下题目:

买x只公鸡,y只母鸡,z只小鸡,要求一共100只,每只公鸡2元,每只母鸡1.5元,每只小鸡0.5元,要求一共100元,并且每一种鸡都要有。

我们以最初无脑的算法计算

public class BuyChicken{
	public static void main(String[] args){
		int plan = 1;
		for(int x = 1;x<100;x++){
			for(int y = 1;y<100;y++){
				for(int z = 1;z<100;z++){
					if(x+y+z==100&&2*x+1.5*y+0.5*z==100){
						System.out.println ("方案"+plan+":公鸡:"+x+",母鸡:"+y+",小鸡:"+z);
						plan++;
					}
				}
			}
		}
	}
}
           

运行结果:

方案1:公鸡:2,母鸡:47,小鸡:51
方案2:公鸡:4,母鸡:44,小鸡:52
方案3:公鸡:6,母鸡:41,小鸡:53
方案4:公鸡:8,母鸡:38,小鸡:54
方案5:公鸡:10,母鸡:35,小鸡:55
方案6:公鸡:12,母鸡:32,小鸡:56
方案7:公鸡:14,母鸡:29,小鸡:57
方案8:公鸡:16,母鸡:26,小鸡:58
方案9:公鸡:18,母鸡:23,小鸡:59
方案10:公鸡:20,母鸡:20,小鸡:60
方案11:公鸡:22,母鸡:17,小鸡:61
方案12:公鸡:24,母鸡:14,小鸡:62
方案13:公鸡:26,母鸡:11,小鸡:63
方案14:公鸡:28,母鸡:8,小鸡:64
方案15:公鸡:30,母鸡:5,小鸡:65
方案16:公鸡:32,母鸡:2,小鸡:66

进程已结束,退出代码 0

           

我们对此进行优化:

由题可知

x+y+z=100;

2x+1.5y+0.5*z=100;

可得:

3x+2y=100;

可知x最小为1,此时y最大为49;

y最小为1,此时x最大为32;

且z=100-x-y;

public class BuyChicken {
    public static void main(String[] args){
        int plan = 1;
        for(int x = 1;x<=32;x++){
            for(int y = 1;y<=49;y++){
                if(2*x+1.5*y+0.5*(100-x-y)==100) {
                    System.out.println("方案" + plan + ":公鸡:" + x + ",母鸡:" + y + ",小鸡:" + (100-x-y));
                    plan++;
                }
            }
        }
    }
}
           

但这并不是最简,我们可以根据3x+2y=100得出y的值,并且我们知道y与z的系数分别是1.5与0.5,要想刚好用100元买,x的数量必定是偶数(因为若x的数量为奇数,则y与z的总数量为奇数,所以y与z的数量必有一个为奇数);

public class BuyChicken {
    public static void main(String[] args){
        int plan = 1;
        for(int x = 2;x<=32;x+=2){
            System.out.println("方案" + plan + ":公鸡:" + x + ",母鸡:" + (100-3*x)/2 + ",小鸡:" + (100-x-(100-3*x)/2));
            plan++;
        }
    }
}
           

这样就可以把循环次数从99* 99* 99次减少到16次了喔!

欢迎大家一起评论改进!