暴力求解法--枚举法

枚举:枚举法就是找出所有的可能,然后去掉不符合条件的可能,从而得到正确答案,我们可以不用直接得到答案,通过简单的条件缩小范围然后自己判断也可。

要点:1.枚举应该找到枚举对象,和枚举对象的取值范围。
         2.枚举不一定是直接解决某个题,可能在这个题中的某处用到了枚举,比如在递归中我们在进行第一步运算时我们往往是枚举出所有可能,我们也可以利用枚举来列出特殊情况等,避免了复杂的代码。
          3.我们在枚举前可以通过分析题意从而缩小枚举范围。

1.输入n个元素组成的序列s,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正数,应输出0(表示无解)
public void jisuan(int n,int a[]) {
   int max=0;
   int thismax;
   for(int i=0;i

此时我们要弄清枚举的对象,这个时候枚举的对象是所有可能的子序列,另一个值得注意的问题是
枚举对象是子集的起点和终点。

2.完美立方体

输入正整数k,找到所有的小于k的正整数a,b,c,d,使得a^3=b^3+c^3+d^3,并且b

使用枚举法的思想虽然是考虑到所有的可能,从所有可能中选出符合条件的可能。所以我们对问题进行一定的分析往往会让算法更加简洁,高效

比如这个题,枚举时可以缩小a,b,c,d的范围,使得程序更高效
如果不考虑就进行计算算法如下

  public void jisuan(int k) {
   for(int a=1;a    for(int b=1;b     for(int c=1;c      for(int d=1;d       if(a*a*a==b*b*b+c*c*c+d*d*d&&b        System.out.println(a+" "+b+" "+c+" "+d);
如果对问题进行了一些分析就可以排除掉一些根本不可能的选项从而减小计算量,本题就是减小了变量的范围从而避免了不必要的计算

public void jisuan(int n) {
  for(int a=2;a<=n;a++) {
  for(int b=2;b<=n;b++) {
  for(int c=b;c  for(int d=c;d  if(a*a*a==b*b*b+c*c*c+d*d*d) {
  System.out.println(a+" "+b+" "+c+" "+d);}}}}}}
       

3.

分数拆分:输入正整数k,找到所有的正整数x>=y,使得1/k=1/x+1/y
分析:枚举就是将所有的可能性都列举起来,然后一一进行实验,然而在枚举前进行一定的分析来减少程序计算量往往是有必要的。比如这个题 从x>=y和 1/k=1/x+1/y我们可以推的y<=2k,我们就减少了不必要的计算



你可能感兴趣的:(暴力求解法--枚举法)