问题描述:
已知所有砝码重量均为3的倍数,且所有重量的砝码有且只有一个
要求输出重量1到n的所有物品的称重方式
解题思路:
用字符串拼接结果
三进制的返回值为0 1 2
返回值为0则表示该权重不取
返回值为1表示加上该权重
返回值为2表示该权重需要加上两遍,不符合题意. 故需将其转换为-1减掉该位权重,对商进行改变.
如: 2 ÷ 3 - 2 ... 0 == -1 ... 1
代码实现:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int w = input.nextInt();
for (int i = 1; i <= w; i++) {
System.out.println(i + ": " + fun(i));
}
input.close();
}
public static String fun(int w) {
String str = "";
int q = 1; //权重
while(w > 0) {
int s = w/3; //商
if (w%3 == 1) str = "+" + q + str; //若余数为1则加上当前权重
if (w%3 == 2) { //若余数为2则减去当前权重
//w += q;
s++;
str = "-" + q + str;
}
w = s;
q *= 3;
}
return str.substring(1); //去掉str首符号返回
}
}
编译运行:
查阅相关github代码请移步:https://github.com/striner/javaCode/blob/master/Weigher%20weighing%20II

本文介绍了如何利用三进制解法解决一个经典的算法问题:已知所有砝码重量为3的倍数,求1到n的所有物品的称重方式。通过将三进制的0、1映射到是否添加砝码,避免使用2来表示加两次,以符合题意。详细解题思路、代码实现和编译运行过程在文中均有说明。

5128

被折叠的 条评论
为什么被折叠?



