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

主要是组合方法,高手来.,
2024-11-23 21:03:49
推荐回答(2个)
回答1:

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

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

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

回答2:

/*我的名字叫肖伟!记住我!*/

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

import java.util.*;
public class 砝码称重 {
static String fm[]={"1","3","9","27","81"};
static int goal;
static List list=new LinkedList();
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 list){
int length=list.size()*2-1;
String temp[]=new String[length];

for(int i=0,j=0;j temp[i]=list.get(j);
}

for(int i=0;i int p=i;
int tmp=p%2;

for(int j=0;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
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 System.out.print(temp[i]);
}

}

public static void combination(int index,int n,Listlist){

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

}

}