砝码称重(软件大赛)


5个砝码

用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有5个砝码,重量分别是1,3,9,27,81。则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。
本题目要求编程实现:对用户给定的重量,给出砝码组合方案。
例如:
用户输入:
5
程序输出:
9-3-1
用户输入:
19
程序输出:
27-9+1

要求程序输出的组合总是大数在前小数在后。
可以假设用户的输入的数字符合范围1~121。

代码:

package BigTitle;
import java.util.Scanner;
import java.util.Stack;
    public class FaMaChengZhong {
        private static Scanner cin;
        private static int arr[]={1,3,9,27,81};
        private static Stack<String> stack=new Stack<String>();
        private static boolean judge[]=new boolean[5];
        private static boolean add=true;//true表示加号,false表示减号
        public static void main(String args[])
        {
            cin=new Scanner(System.in);
            int a=cin.nextInt();
             for(int i=0;i<5;i++)
                 judge[i]=true;//把这五个数都标记为没读过
             find(a);
        }
        public static void find(int num)
        {
            int d;
            for(int i=0;i<5;i++)
            {
                if(arr[i]==num&&judge[i])//最后的数正好是其中的一个,搜索完成
                {
                    stack.push(""+arr[i]);
                for(String sta:stack)//打印结果
                    System.out.print(sta);
                System.out.println();
                System.exit(0);
                }
            }
            for(int i=1;i<5;i++)
            {
                if(arr[i-1]<num&&num<arr[i]&&judge[i])//确定a在哪两个数之间,选择大数进来
                {
                    d=arr[i]-num;
                    judge[i]=false;
                    if(add)//前面是加号,后面减号不改变
                    {
                    stack.push(arr[i]+"-");
                    add=false;//把原来的加号设置为减号
                    find(d);
                    add=true;//
                    }
                    else //前面是减号,后面减号变为加号
                    {
                        stack.push(arr[i]+"+");
                        add=true;//将原来的减号设置为当前的加号
                        find(d);
                    }
                    stack.pop();//把栈里的东西吐出来
                    judge[i]=true;//自然,judge【i】就相当于没被使用过
                }
                if(arr[i-1]<num&&num<arr[i]&&judge[i-1])//确定a在哪两个数之间,选择小数进来
                {
                    judge[i-1]=false;
                    d=num-arr[i-1];
                    if(add)//前面是加号,后面的加号不改变
                    {
                        stack.push(arr[i-1]+"+");
                        find(d);
                    }
                    else //前面是减号,后面的加号变减号
                    {
                        stack.push(arr[i-1]+"-");
                        find(d);
                    }
                    stack.pop();
                    judge[i-1]=true;
                }
                else
                {
                    if(arr[4]<num&&num<=121&&judge[4])
                    {
                        judge[4]=false;
                        d=num-arr[4];
                    if(add)
                    {
                      stack.push(arr[4]+"+");
                      find(d);
                    }
                    else
                    {
                        stack.push(arr[4]+"-");
                        find(d);
                    }
                    stack.pop();
                    judge[4]=true;
                    }
                }    
            }    
        }
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值