很显然,有时候一种分量的砝码要用到多次,比如2这个值,必须要有2个1才能完成。那么任何一个数n都可以用n个1来组合。这说明,你的题目不严密。至少你需要规定每个砝码的个数上限。
不过尽管如此,还是可以用每个砝码最多两次的方案来进行组合。方法就是把数字写成3进制形式。每一位上的数字是多少,就使用多少个相应的砝码。从小到大,3的0次方对应末尾,3的1次方对应第二位,以此类推
如121这个数,它等于(11111)3,所以上面五个砝码个用1次。
/*我的名字叫肖伟!记住我!*/
/*上面的人说那么多的废话!还不如我那代码来回答您!*/
import java.util.*;
public class 砝码称重 {
static String fm[]={"1","3","9","27","81"};
static int goal;
static List
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
int length=list.size()*2-1;
String temp[]=new String[length];
for(int i=0,j=0;j
}
for(int i=0;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
}
}
public static void combination(int index,int n,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);
}
}