算法基础——1.2枚举与剪枝
来源:互联网 发布:夜猫子软件 编辑:程序博客网 时间:2024/04/29 14:54
例一
- /*
- 要找8元钱。
- 有零钞:5元,2元,1元,5角。
- 求所有找零方案
- */
- public class T1
- {
- public static void main(String[] args)
- {
- int SUM = 80;
- for(int a=0; a <= SUM/50; a++){
- for(int b=0; b <= SUM/20; b++){
- for(int c=0; c <= SUM/10; c++){
- for(int d=0; d <= SUM/5; d++){
- if(a*50 + b*20 + c*10 + d*5==SUM)
- System.out.println(a+","+b+","+c+","+d);
- }
- }
- }
- }
- }
- }
例二:
- /*
- n位数平方的尾数还是自己
- */
- public class T2
- {
- public static void main(String[] args)
- {
- // 仔细观察
- // 这样的数字的尾数有什么特征? 0 1 5 6
- // 进一步,其末尾2位数必须是 25 76
- // 更进一步,其末尾3位数必须是?。。。。
- for(int i=100; i<1000; i++){
- int n = i*i; //平方后
- int m = i%10;
- if(m!=0 && m!=1 && m!= 5 && m!= 6) continue;
- if(n%1000==i) System.out.println(i + "," + n);
- }
- }
- }
例三:
方法一
- /*观察算式
- 观察下面的算式:
- △△△ * △△ = △△△△
- 某3位数乘以2位数,结果为4位数
- 要求:在9个△所代表的数字中,1~9的数字恰好每个出现1次。*/
- public class HomeWork2 {
- public static void main(String[] args) {
- long startTime=System.nanoTime();//获取开始时间
- int a , b, c;//a*b=c a = i1 * 100 + i2 * 10 + i3; b = i4 * 10 + i5;
- for(int i1 = 1; i1 < 10; ++i1)
- for(int i2 = 1; i2 < 10 ; ++i2){
- if(i2 == i1)
- continue;
- for(int i3 = 1; i3 < 10 ; ++i3)
- {
- if(i3 == i1 || i3 == i2)
- continue;
- a = i1 * 100 + i2 * 10 + i3;
- for(int i4 = 1; i4 < 10 ; ++i4){
- if(i4 == i1 || i4 == i2 || i4 == i3)
- continue;
- for(int i5 = 1; i5 < 10 ; ++i5)
- {
- if(i5 == i1 || i5 == i2 || i5 == i3 || i5 == i4)
- continue;
- b = i4 * 10 + i5;
- c = a * b;
- if(c <= 9876 && c >= 1234 )
- {
- int c1 = c/1000;//c的千位
- int c2 = (c/100)%10;//c的百位
- int c3 = (c/10)%10;//c的十位
- int c4 = c%10;//c的个位
- //c不满足条件
- 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)
- continue;
- else System.out.println(a+" * "+b+" = "+c);
- }
- }
- }
- }
- }
- long endTime=System.nanoTime(); //获取结束时间
- System.out.println("程序运行时间: "+(endTime-startTime)+"ns");
- }
- }
方法二
- public class HomeWork1 {
- /**
- * 观察下面的算式:△△△ * △△ = △△△△ 某3位数乘以2位数,结果为4位数。
- * 要求:在9个△所代表的数字中,1~9的数字恰好每个出现1次。
- */
- public static void main(String[] args) {
- long startTime=System.nanoTime();
- int num[]= new int[10]; //只使用num[1]~num[9],做1~9数字的哈希映射表。
- for(int i=12; i<=98; i++){
- //两位数最小从12开始,最大98
- if(i%10 == 0 || i%10 == i/10 )
- continue;//末位为零,或两位相等,剪掉
- initArray(num, 0); //初始化哈希映射表,表元素num[1]~num[9]全为零
- num[i%10]=1;//将两位数的两个数字在哈希映射表中做标志,为1
- num[i/10]=1;
- for(int j= 1;j<=9; j++){
- //遍历哈希映射表num[],找出所有满足条件的三位数,每次从最小的三位数找起。
- if(num[j]==0){//j为三位数的百位
- num[j]=2;//将满足的j标记为2
- for(int k=1;k<=9;k++){//k为三位数的十位数,
- if(num[k]==0){
- num[k]=3;//将满足的k标记为3
- for(int n=1;n<=9;n++){//n为三位数的各位数
- if(num[n]==0){
- num[n]=4;//将满足的n,标记为4
- int thirdnum = j*100+ k*10+ n;//符合条件的三位数
- int fact=i*thirdnum;
- int fact1=fact;
- if(fact>9876){//两位数乘以三位数若大于最大的四位数,则剪掉
- num[n]=0;//复原已标记的个位数
- break;
- }
- boolean flag=true;//检查得到的四位数满不满足条件
- for(int m=1000;m>=1;m/=10){
- if(num[fact1/m]==0){
- num[fact1/m]=-1;//在哈希映射表中查找是否是剩余的数字,若是,标记为-1
- fact1=fact1-(fact1/m)*m;
- }else{
- flag=false;
- break;
- }
- }
- if(flag == true){//满足则输出
- System.out.println("满足条件的算式是:");
- System.out.println(i + " * " + thirdnum + " = " + fact);
- }
- num[n]=0;//复原已标记的个位数
- initArray(num, -1);//复原已标记的-1
- }
- }
- num[k]=0;//复原已标记的十位数
- }
- }
- num[j]=0;//复原已标记的百位数
- }
- }
- }
- long endTime=System.nanoTime(); //获取结束时间
- System.out.println("程序运行时间: "+(endTime-startTime)+"ns");
- }
- public static void initArray(int num[], int flag){
- //初始化映射数组,当flag=0,清零num[1]~num[9]数组元素,flag=-1,1,2,3,4,则清零值等于flag的数组元素。
- switch(flag){
- case -1:
- case 1:
- case 2:
- case 3:
- case 4: for(int i=0;i<num.length;i++){
- if(num[i] == flag){
- num[i]=0;
- }
- }
- num[0]=-2;//num[0]不用,标记为-2
- break;
- default:for(int i=0;i<num.length;i++){
- num[i]=0;
- }
- num[0]=-2;//num[0]不用,标记为-2
- }
- }
- }
0 0
- 算法基础——1.2枚举与剪枝
- 编程算法基础-枚举与剪枝
- 算法基础——1.2枚举与剪枝(找零钱、n位数平方的尾数还是自己)
- 算法基础-枚举与剪枝_观察算式
- 算法思想:枚举与剪枝
- 枚举与剪枝算法学习笔记
- 《算法基础》枚举——画家问题
- 最优化剪枝——不无脑的枚举
- 决策树算法与剪枝处理
- 搜索的优化算法——剪枝
- 搜索的优化算法——剪枝
- 算法基础:1枚举
- 算法基础---枚举案例
- 算法与设计——枚举——ch_01
- 基础算法思想_枚举(穷举)算法——填数游戏
- 第01讲-枚举与剪枝_观察算式
- JAVA基础——枚举
- 决策树之剪枝原理与CART算法
- POJ 2299 && HDU 3743 归并排序
- Angularjs 学习记录
- 多线程解决安全问题的方法(Synchronized)
- 豌豆荚手机助手电脑版 v2.75.0.6063 官方pc版
- 孩子的稚气天真游戏渐行渐远[图]
- 算法基础——1.2枚举与剪枝
- 酷狗音乐盒2014 v7.5.8.5 官方免费版
- 计算机原理学习(7)-- x86-32 CPU和内存管理之分段管理
- ios7隐藏状态栏
- Java动态绑定机制的内幕
- 为什么有堆内存栈内存之分
- jsonp跨域请求
- UVA 12576 - Simply Loopy
- ipv4理论知识1-ipv4介绍,ipv4记法,地址段个数算法