用了递归和回溯,其中标注的语句,可控制输出结果为哪种情况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种
* @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种
修改后的代码是 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)
即可。