算法基础——1.2枚举与剪枝

来源:互联网 发布:夜猫子软件 编辑:程序博客网 时间:2024/04/29 14:54


例一

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /* 
  2.   要找8元钱。 
  3.   有零钞:5元,2元,1元,5角。 
  4.   求所有找零方案 
  5. */  
  6.   
  7. public class T1  
  8. {  
  9.     public static void main(String[] args)  
  10.     {  
  11.         int SUM = 80;  
  12.           
  13.         for(int a=0; a <= SUM/50; a++){  
  14.             for(int b=0; b <= SUM/20; b++){  
  15.                 for(int c=0; c <= SUM/10; c++){  
  16.                     for(int d=0; d <= SUM/5; d++){  
  17.                         if(a*50 + b*20 + c*10 + d*5==SUM)  
  18.                             System.out.println(a+","+b+","+c+","+d);  
  19.                     }                 
  20.                 }  
  21.             }  
  22.         }  
  23.     }  
  24. }  

例二:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /* 
  2.  n位数平方的尾数还是自己 
  3. */  
  4.   
  5. public class T2  
  6. {  
  7.     public static void main(String[] args)  
  8.     {  
  9.         // 仔细观察  
  10.         // 这样的数字的尾数有什么特征? 0 1 5 6  
  11.         // 进一步,其末尾2位数必须是 25 76  
  12.         // 更进一步,其末尾3位数必须是?。。。。  
  13.           
  14.         for(int i=100; i<1000; i++){  
  15.             int n = i*i;  //平方后  
  16.             int m = i%10;  
  17.             if(m!=0 && m!=1 && m!= 5 && m!= 6continue;              
  18.             if(n%1000==i) System.out.println(i + "," + n);  
  19.         }  
  20.     }  
  21. }  

例三:

方法一

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /*观察算式 
  2. 观察下面的算式: 
  3. △△△ * △△ = △△△△ 
  4. 某3位数乘以2位数,结果为4位数 
  5. 要求:在9个△所代表的数字中,1~9的数字恰好每个出现1次。*/  
  6. public class HomeWork2 {  
  7.   
  8.     public static void main(String[] args) {  
  9.         long startTime=System.nanoTime();//获取开始时间  
  10.           
  11.         int a , b, c;//a*b=c    a = i1 * 100 + i2 * 10 + i3;  b = i4 * 10 + i5;  
  12.         for(int i1 = 1; i1 < 10; ++i1)  
  13.             for(int i2 = 1; i2 < 10 ; ++i2){  
  14.                 if(i2 == i1)  
  15.                     continue;  
  16.                 for(int i3 = 1; i3 < 10 ; ++i3)  
  17.                 {  
  18.                     if(i3 == i1 || i3 == i2)  
  19.                         continue;  
  20.                       
  21.                     a = i1 * 100 + i2 * 10 + i3;  
  22.                   
  23.                     for(int i4 = 1; i4 < 10 ; ++i4){  
  24.                         if(i4 == i1 || i4 == i2 || i4 == i3)  
  25.                             continue;  
  26.                         for(int i5 = 1; i5 < 10 ; ++i5)  
  27.                         {  
  28.                             if(i5 == i1 || i5 == i2 || i5 == i3 || i5 == i4)  
  29.                                 continue;  
  30.                             b = i4 * 10 + i5;  
  31.                             c = a * b;  
  32.                               
  33.                             if(c <= 9876 && c >= 1234 )  
  34.                             {  
  35.                                 int c1 = c/1000;//c的千位  
  36.                                 int c2 = (c/100)%10;//c的百位  
  37.                                 int c3 = (c/10)%10;//c的十位  
  38.                                 int c4 = c%10;//c的个位  
  39.                                 //c不满足条件  
  40.                                 if(c1 == 0 || c2 == 0 || c3 == 0 || c4 == 0|| c1 == c2 || c1 == c3 || c1 == c4 || c2 == c3 || c2 == c4 || c3 == c4  || c1 == i1 || c1 == i2 || c1 == i3 || c1 == i4 || c1 == i5 || c2 == i1 || c2 == i2 || c2 == i3 || c2 == i4 || c2 == i5|| c3 == i1 || c3 == i2 || c3 == i3 || c3 == i4 || c3 == i5 || c4 == i1 || c4 == i2 || c4 == i3 || c4 == i4 || c4 == i5)  
  41.                                     continue;  
  42.                                 else System.out.println(a+" * "+b+" = "+c);  
  43.                             }                     
  44.                         }  
  45.                     }  
  46.                 }  
  47.             }  
  48.         long endTime=System.nanoTime(); //获取结束时间  
  49.         System.out.println("程序运行时间: "+(endTime-startTime)+"ns");  
  50.   
  51.   
  52.     }  
  53.   
  54. }  

方法二

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class HomeWork1 {  
  2.   
  3.         /** 
  4.          * 观察下面的算式:△△△ * △△ = △△△△ 某3位数乘以2位数,结果为4位数。 
  5.          * 要求:在9个△所代表的数字中,1~9的数字恰好每个出现1次。 
  6.          */  
  7.         public static void main(String[] args) {  
  8.             long startTime=System.nanoTime();  
  9.             int num[]= new int[10]; //只使用num[1]~num[9],做1~9数字的哈希映射表。  
  10.   
  11.             for(int i=12; i<=98; i++){  
  12.                 //两位数最小从12开始,最大98  
  13.                 if(i%10 == 0 || i%10 == i/10 )  
  14.                     continue;//末位为零,或两位相等,剪掉  
  15.                 initArray(num, 0);      //初始化哈希映射表,表元素num[1]~num[9]全为零  
  16.                 num[i%10]=1;//将两位数的两个数字在哈希映射表中做标志,为1  
  17.                 num[i/10]=1;  
  18.                 for(int j= 1;j<=9; j++){  
  19.                     //遍历哈希映射表num[],找出所有满足条件的三位数,每次从最小的三位数找起。  
  20.                     if(num[j]==0){//j为三位数的百位  
  21.                         num[j]=2;//将满足的j标记为2  
  22.                         for(int k=1;k<=9;k++){//k为三位数的十位数,  
  23.                             if(num[k]==0){  
  24.                                 num[k]=3;//将满足的k标记为3  
  25.                                 for(int n=1;n<=9;n++){//n为三位数的各位数  
  26.                                     if(num[n]==0){  
  27.                                         num[n]=4;//将满足的n,标记为4  
  28.                                         int thirdnum = j*100+ k*10+ n;//符合条件的三位数  
  29.                                         int fact=i*thirdnum;  
  30.                                         int fact1=fact;  
  31.                                         if(fact>9876){//两位数乘以三位数若大于最大的四位数,则剪掉  
  32.                                             num[n]=0;//复原已标记的个位数  
  33.                                             break;  
  34.                                         }  
  35.                                         boolean flag=true;//检查得到的四位数满不满足条件  
  36.                                         for(int m=1000;m>=1;m/=10){  
  37.                                             if(num[fact1/m]==0){  
  38.                                                 num[fact1/m]=-1;//在哈希映射表中查找是否是剩余的数字,若是,标记为-1  
  39.                                                 fact1=fact1-(fact1/m)*m;  
  40.                                             }else{  
  41.                                                 flag=false;  
  42.                                                 break;  
  43.                                             }  
  44.                                         }  
  45.                                         if(flag == true){//满足则输出  
  46.                                             System.out.println("满足条件的算式是:");  
  47.                                             System.out.println(i + " * " + thirdnum + " = " + fact);  
  48.                                         }  
  49.                                         num[n]=0;//复原已标记的个位数  
  50.                                         initArray(num, -1);//复原已标记的-1  
  51.                                     }  
  52.                                 }  
  53.                                   
  54.                                 num[k]=0;//复原已标记的十位数  
  55.                             }  
  56.                         }  
  57.                         num[j]=0;//复原已标记的百位数  
  58.                     }  
  59.                 }  
  60.             }  
  61.             long endTime=System.nanoTime(); //获取结束时间  
  62.             System.out.println("程序运行时间: "+(endTime-startTime)+"ns");  
  63.         }  
  64.         public static void initArray(int num[], int flag){  
  65.             //初始化映射数组,当flag=0,清零num[1]~num[9]数组元素,flag=-1,1,2,3,4,则清零值等于flag的数组元素。  
  66.             switch(flag){  
  67.             case -1:  
  68.             case 1:  
  69.             case 2:  
  70.             case 3:  
  71.             case 4for(int i=0;i<num.length;i++){     
  72.                         if(num[i] == flag){  
  73.                             num[i]=0;  
  74.                         }  
  75.                     }  
  76.                     num[0]=-2;//num[0]不用,标记为-2  
  77.                     break;  
  78.             default:for(int i=0;i<num.length;i++){     
  79.                         num[i]=0;  
  80.                     }  
  81.                     num[0]=-2;//num[0]不用,标记为-2  
  82.             }  
  83.         }  
  84. }  
0 0
原创粉丝点击