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;
}
}
}
}
}