算法题--砝码称重

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

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


解题思路:对于题目给出的5个砝码数,无非就是三个可能性,要么是正数,要么是0,要么就是负数,所以可以让这5个数乘以{1,0,-1}得到可能的结果,最后再采用暴力破解的方式得出正确答案。

代码示例:

import java.util.Scanner;

public class Main {
	public static void f(int n) {
		int[] sign = new int[] { -1, 0, 1 }; // 定义符号
		StringBuffer sb = new StringBuffer();
		for (int a : sign) {
			for (int b : sign) {
				for (int c : sign) {
					for (int d : sign) {
						for (int e : sign) {
							int i = a * 1;
							int j = b * 3;
							int k = c * 9;
							int l = d * 27;
							int m = e * 81;
							if (i + j + k + l + m == n) { // 找到结果
								// 如果不为0,则添加元素,并在"正数"前添加"+"号
								sb.append(m != 0 ? (m > 0 ? "+" + m : m) : "");
								sb.append(l != 0 ? (l > 0 ? "+" + l : l) : "");
								sb.append(k != 0 ? (k > 0 ? "+" + k : k) : "");
								sb.append(j != 0 ? (j > 0 ? "+" + j : j) : "");
								sb.append(i != 0 ? (i > 0 ? "+" + i : i) : "");
								sb.deleteCharAt(0); // 去掉首元素的"+"号;
								System.out.println(sb);
								return;
							}
						}
					}
				}
			}
		}
	}

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt(); // 输入重量
		f(n);
	}
}

 

你可能感兴趣的:(Java,算法)