用了递归和回溯,其中标注的语句,可控制输出结果为哪种情况public class ChaiJie { /**
 * @param args
 */
public static void main(String[] args) {
num = 50;
ChaiJie jie = new ChaiJie();
jie.chai(0,1);
System.out.println("一共" + count + "种");
} int[] a = new int[num];
static int num;
static int count; public void chai(int x,int i) {
for (; i < num; i++) {
a[x] = i;
if (check(a) == num) {
output();
i = num;
} else if (check(a) < num) {
                        //如果把方法参数i去掉,则输出同数不同位的结果
chai(x + 1,i);
}
a[x] = 0;
}
} public int check(int[] a) {
int sum = 0;
for (int i = 0; i < a.length; i++) {
sum += a[i];
if (sum > num) {
return sum;
}
}
return sum;
} public void output() {
count++;
StringBuffer sb1 = new StringBuffer();
sb1.append("第").append(count).append("种:");
for (int i = 0; i < a.length; i++) {
if (a[i] != 0) {
sb1.append(a[i]).append("+");
}
}
sb1.delete(sb1.length() - 1, sb1.length());
sb1.append("=").append(num).append("\r");
System.out.print(sb1);
}}
不重复的可能性
第1种:1+1+1+1+1=5
第2种:1+1+1+2=5
第3种:1+1+3=5
第4种:1+2+2=5
第5种:1+4=5
第6种:2+3=5
一共6种重复不同位置的可能性
第1种:1+1+1+1+1=5
第2种:1+1+1+2=5
第3种:1+1+2+1=5
第4种:1+1+3=5
第5种:1+2+1+1=5
第6种:1+2+2=5
第7种:1+3+1=5
第8种:1+4=5
第9种:2+1+1+1=5
第10种:2+1+2=5
第11种:2+2+1=5
第12种:2+3=5
第13种:3+1+1=5
第14种:3+2=5
第15种:4+1=5
一共15种

解决方案 »

  1.   

    算法还行。
    修改后的代码是    public void chai(int x ) {
            for (int i=1; i < num; i++) {
                a[x] = i;
                if (check(a) == num) {
                    output();
                    i = num;
                } else if (check(a) < num) {
                     chai(x + 1);
                }
                a[x] = 0;
            }
        }
    然后main中调用
    chai(0)
    即可。