日期:2014-05-20  浏览次数:20786 次

小公司笔试题一道,还新鲜呢,今天刚做的
1~19这19个数字,任意多个数相加等于20的所有组合,不重复

------解决方案--------------------
本帖最后由 AWUSOFT 于 2013-02-18 20:43:32 编辑
使用递归技术.

public class Test {
private static int max=19;
private static int sum=20;
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=1;i<max-1;i++){
getStr("",0,i);
}
}
public static void getStr(String str,int tempSum,int i){
if(i>max){
return;
}
//如果前面的值加上当前的值等于要求的值,就输出
if(tempSum+i==sum){
System.out.println(str+"+"+i+"="+sum);
}else if(tempSum+i>sum){
return;
}else{
//如果是值小于要求的值,就加上了当前的值,然后继续对下一个数进行判断
for(int j=i+1;j<max;j++){
if("".equals(str)){
getStr(str+i,tempSum+i,j+1);
}else{
getStr(str+"+"+i,tempSum+i,j+1);
}
}
}
}
}

------解决方案--------------------
递归拆分,一个数,拆成两个,两个拆成3个一直到无法拆分
import java.util.Arrays;

public class SumTest {
/*
 * 假定结果集合为一个从小到大排列的数组,初始化为一个元素,将元素拆分,最终形成若干个数组,使每个数组的和等于原数组的值
 */
public static void sum(int min, int[] result) {
int sum = result[result.length - 1];
for (int i = min; i <= sum - i; i++) {
if (sum - i >= i) {
int[] temp = new int[result.length + 1];
System.arraycopy(result, 0, temp, 0, result.length - 1);
temp[result.length - 1] = i;
temp[result.length] = sum - i;
System.out.println(Arrays.toString(temp));
sum(i, temp);

}

}
}

public static void main(String args[]) {
SumTest.sum(1, new int[] { 20 });
}
}