一道竞赛题

本文介绍了一种通过使用特定权重的砝码来精确称量物品重量的算法。该算法利用了1、3、9、27、81这五个特殊数值的砝码,能够组合出1到121之间的任意整数重量。文章详细解释了如何通过递归方法找出最佳的砝码组合,并提供了一个完整的Java程序实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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


输入:
41
输出:
81-27-9-3-1


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



思路:
int[] fama砝码的重量;
int weight要求的重量。
Stack stack储存比weight小的数;
例如:int[] fama = {1, 3, 9, 27, 81};int weight=50;stack={1,3,9,27};
执行action(50,sb)//sb stringbuffer;
1.如果weight > stack元素之和,说明81在 sb中。所以 sb = 81-(;运行aciton(81-50,sb);
2.如果 weight = stack元素之和,直接sb = 1+3+9+27;
3.如果 weight< stack元素之和,把27出栈顶,运行aciton(50,sb);
所以执行1了,运行action(31,sb)
执行1,31> 1+3+9,所以找到27
如果 27>31 sb=81-(27-
如果27<31 sb = 81-(27+
重复操作
最后结果是
81+(27-(9-(3-(1))));
剩下的就是拆括号了。




public class TianPing {  


Integer[] fama;  

int weight;  

Stack<Integer> stack=new Stack<Integer>();  

StringBuffer sb = new StringBuffer();  

public TianPing(Integer[] array,int weight){  

this.fama = array;  

this.weight = weight;  

for(int a:fama){  

if(a <= weight){  

stack.push(a);  

}  

}  

action(weight,sb);System.out.println(sb.toString());  

}  

public void action(int weight,StringBuffer sb){  

int totalWeight = 0;  

while(weight <= stack.peek()){  

if(weight==stack.peek()){  

sb.append(stack.peek());  

return;  

}  

stack.pop();  

}  

for(int i=0;i<stack.size();i++){  

totalWeight+=stack.elementAt(i);  

}  

if(weight>totalWeight){  

if(fama[stack.size()]>weight){  

sb.append(fama[stack.size()]+"-(");  

action(fama[stack.size()]-weight,sb);  

sb.append(")");  

} else if(fama[stack.size()]<weight){  

sb.append(fama[stack.size()]+"+");  

action(weight - fama[stack.size()],sb);  

}  

} else if(weight < totalWeight){  

stack.pop();  

action(weight,sb);  

} else if(weight == totalWeight){  

while(!stack.isEmpty()){  

sb.append(stack.pop()+"+");  

}  

sb.setLength(sb.length()-1);  

return;  

}  

}  

public static void main(String args[]){  

Integer []array = {1,3,9,27,81};  

for(int i=1;i<=121;i++){  

new TianPing(array,i);  

}  

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值