使用枚举算法的简化时间的技巧

相信大家都对枚举算法不陌生吧!

枚举算法:顾名思义,枚举,就是一一列出来,然后找到你所需要的解决方法即可,不过用人脑去算如果需要枚举很多数字,那显然是不划算的,我们可以利用计算机的计算功能很快的解决,但是虽然计算机计算的很快,但是往往在一些算法竞赛中是规定了时间限制和内存限制的,时间限制一般为1000ms

我们来看一道题目:

一个工厂有甲乙丙丁四名工人,他们一共生产了370个产品,恰巧当甲多生产10个,乙少生产20个

 丙生产原来的2倍,丁生产原来的1/2倍,他们四个生产的数量相同,求他们原来各生产多少产品

我们看了一下有四个变量需要求解,那简单啊,四个for循环再用一个if来找出符合条件的解

代码1:

public class DoubleFor {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long start = System.currentTimeMillis();    //计算开始时间
        for(int a = 1;a<=370;a++) {
        	for(int b = 1;b<=370;b++) {
        		for(int c = 1;c<=370;c++) {
        			for(int d = 1;d<=370;d++) {
        				if(a+10 == b-20 && b-20 == c*2 && c*2 == d/2) {
        					System.out.printf("甲乙丙丁各生产 %-4d%-4d%-4d%-4d",a,b,c,d);
        					System.out.println();
        				}
        			}
        		}
        	}
        }

		long end = System.currentTimeMillis();     //结束时间
        System.out.println("一共用了"+(end-start)+"ms");
	}
}

结果:


然后我们发现这样算出来的时间为203ms

在看一个我改进的一点点

代码2:

public class DoubleFor {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long start = System.currentTimeMillis();
				for(int a = 1;a<=367;a++) {
		for(int b = 1;b<=367;b++) {
			for(int c = 1;c<=367;c++) {
				int d = 370-a-b-c;
				if(a+10 == b-20 && b-20 == c*2 && c*2 == d/2) {
					System.out.printf("甲乙丙丁各生产 %-4d%-4d%-4d%-4d",a,b,c,d);
					System.out.println();
			}
		}
		}
		}

		long end = System.currentTimeMillis();
        System.out.println("一共用了"+(end-start)+"ms");
	}
}

来看看运行结果:


节省了203-67为多少136ms

现在我们看不出来加入是3700个呢我们在来看看

代码1运行结果:


代码2结果:


这次可以看出来了吧一个小小的简化,可以省去多少时间,在竞赛中虽然枚举效率低,但是有时候适当的使用反而会使你做题的时间更快,上面这个例子简化主要是少了一层循环以及外面的循环次数减少,因为甲乙丙丁四个人至少也能生产1个吧,那么我们可以减少另三个,然后知道其他三个,用总数减掉3个不是得到了第四个的值,我们以后拿到题目,一定要多观察,使用枚举算法一定要注意时间,还有尽可能地去减少循环次数。

猜你喜欢

转载自blog.csdn.net/lytwy123/article/details/80965258