5个砝码,分别是1,3,9,27,81组合出1到121之间任意整数重量,输出的组合总是大数在前小数在后

主要是组合方法,高手来.,

很显然,有时候一种分量的砝码要用到多次,比如2这个值,必须要有2个1才能完成。那么任何一个数n都可以用n个1来组合。这说明,你的题目不严密。至少你需要规定每个砝码的个数上限。

不过尽管如此,还是可以用每个砝码最多两次的方案来进行组合。方法就是把数字写成3进制形式。每一位上的数字是多少,就使用多少个相应的砝码。从小到大,3的0次方对应末尾,3的1次方对应第二位,以此类推

如121这个数,它等于(11111)3,所以上面五个砝码个用1次。追问

就是十进制的数转换成3进制的,看有多少位,就用多少个砝码来组合,是吧?
我还想问的是, 那个 加减 一起用的那个方法,找不到规律.(当然我不知道有没有.呵呵!)

追答

不是看多少位,而是看每一位上的数字是多少,就代表有多少个砝码
比如12012,就代表用81砝码1个,27砝码2个,9砝码0个,3砝码1个,1砝码2个

那个加减一起用的方法,我不知道这个方法具体是怎么样的。但是猜一下,应该是和我的意思一致的。
因为这个问题是要用3的幂来进行组合,而3这样的基数有三种选择,用1次,用2次,以及不用。所以用上减法就意味着:用1次作为加法,用一次作为减法,以及不用这3种状态。其中用一次作为减法和我所说的用2个砝码是存在一一对应关系的。比如2这个数字可以用2次1加法得到,也可以用3作为加法,1作为减法叠加起来得到。

追问

如果每个砝码都只能用一次的呢?
3进制还可以?

追答

如果用上加减法就可以。关键只在于你要给每个砝码有3种状态可以选择
要么: 用1次,用2次,用0次, 这三种状态
要么:用1次作为正数,用1次作为负数,用0次,这三种状态

如果这里的砝码是4的幂,如:1,4,16,64,等等,那么你想要表达256以内的数,那么你就需要4种状态。这时候即便用上加减法也不可能每个数只用1次

追问

怎么判断是第几种状态?

追答

为什么要判断是第几种... 状态没有次序的...

追问

哦,就是有2的 就分一次出来用来 减, 是吧.

追答

嘛..可能你还不能从核心上理解这个问题,不过仅仅对于3的幂这个问题来讲,你这样理解已经没有问题了~

追问

我的问题是:用什么方法来确定用几个数, 用什么方法确定加或减的组合方法.

追答

那就基本就是刚才讲的,以我之前用的12012为例(这个数实际上是140)
首先转换成三进制,也就是12012
然后从末尾起查看每一位,对于第i位来讲(i从0开始)
1. 如果是1,则相当于用3的i次方一次
2. 如果是2,则相当于用3的i次方作为减法1次。并且向高位进1
3. 如果是0,则不需要用到3的i次方

对于12012来讲:
1. 首先第0位(最后1位)为2,所以相当于3的0次方(也就是1)作为减法1次(记为-1),并向高位进1,使得第1位变成2
2. 第1位现在变成了2,所以相当于3的1次方(也就是3)作为减法1次(记为-3),并向高位进1,使得第2位变成1
3. 第2位现在变成了1,所以相当于3的2次方(也就是9)作为加法1次(记为+9)
4. 第3位为2,所以相当于3的3次方(也就是27)作为减法1次(记为-27),冰箱高位进1,使得第4位变成2
5. 第4位现在变成了2,所以相当于3的4次方(也就是81)作为减法1次(记为-81),并向高位进1,使得第5位(由本来没有)变成1
6. 第5位现在是1,所以相当于3的5次方(也就是243)作为加法1次(记为+243)

完成,把上面的数字连起来即可:+243-81-27+9-3-1 = 140

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-11
/*我的名字叫肖伟!记住我!*/

/*上面的人说那么多的废话!还不如我那代码来回答您!*/

import java.util.*;
public class 砝码称重 {
static String fm[]={"1","3","9","27","81"};
static int goal;
static List<String> list=new LinkedList<String>();
public static void main(String[] args) {

Scanner s=new Scanner(System.in);
goal=Integer.parseInt(s.nextLine());

for(int count=1;count<=5;count++){
combination(0,count,list);
}
}

public static void deal(List<String> list){
int length=list.size()*2-1;
String temp[]=new String[length];

for(int i=0,j=0;j<list.size()&&i<temp.length;j++,i+=2){
temp[i]=list.get(j);
}

for(int i=0;i<Math.pow(2, length/2);i++){
int p=i;
int tmp=p%2;

for(int j=0;j<length/2;j++){

switch(tmp){
case 0:
temp[j*2+1]="+";
break;
case 1:
temp[j*2+1]="-";
break;
}
p=p/2;
tmp=p%2;
}
sum(temp);
}
}

public static void sum(String temp[]){

String op="+";
int sum=0;
int result=0;

for(int i=0;i<temp.length;i++){

if(temp[i].compareTo("0")>=0&&temp[i].compareTo("9")<=0){
sum=Integer.parseInt(temp[i]);
}
else{

if(op.equals("+")){
result+=sum;
}else{
result-=sum;
}
sum=0;
op=temp[i];

}

}

if(op.equals("+")){
result+=sum;
}else{
result-=sum;
}

if(result==goal){
for(int i=0;i<temp.length;i++)
System.out.print(temp[i]);
}

}

public static void combination(int index,int n,List<String>list){

if(n==0){

deal(list);
return;

}

if(index>fm.length-1){
return;
}

list.add(0,fm[index]);
combination(index+1,n-1,list);
list.remove(0);
combination(index+1,n,list);

}

}
相似回答