现在给定一个数n,请列出1--(n-1)范围内,所有和为n的组合(数字不能重复使用),比如:n = 10时,
1+9 = 10;
2+8 = 10;
3+7 = 10;
1+2+3+4 = 10;
.......
1+9 = 10;
2+8 = 10;
3+7 = 10;
1+2+3+4 = 10;
.......
解决方案 »
- 关于Iterator Collection
- java日志的问题
- 200分 集思广益,大家公司的软件一般windows的服务器怎么维护?
- 字符串"600<1327 && 1327<4500" 如何转换成表达式,返回true?在线等...
- 里面有免费的六位QQ号
- java中的load是什么用法?
- 求g723的压缩算法?急!!
- java 的一道题目,在线等待!!!!
- 如何将客户端浏览器文件(txt文件)的内容读给一个字符串
- 请问如何学习corba,再推荐几本好的书,最好是和java有关的
- 大牛那么多为什么没人回答小弟的问题(长标题标题党)
- 求知识帝~关于,数据库,XML,properties读取速度和性能问题
public class Add20 {
public static List<List<Integer>> getArrange(int begin, int end, int sum) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (begin>end) return result;
if (begin>sum/2) {
if (sum>=begin && sum<=end) {
result.add(new ArrayList<Integer>());
result.get(0).add(sum);
}
return result;
}
List<List<Integer>> l1 = getArrange(begin+1, end, sum-begin);
for (int i=0; i<l1.size(); i++) l1.get(i).add(0, begin);
result.addAll(l1);
result.addAll(getArrange(begin+1, end, sum));
return result;
} public static void main(String[] args) {
List<List<Integer>> list = getArrange(1,20,20);
System.out.println(list.size() + "种组合:");
for (int i=0; i<list.size(); i++)
System.out.println(list.get(i));
}
}
这个题的算法可以解决更广级别的问题,楼主的题目是这个解法中的一个情况。Description
乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,
但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。
Input
输入包含多组数据,每组数据包括两行。第一行是一个不超过64的整数,表示砍断之后共有多少节木棍。第二行是截断以后,所得到的各节木棍的长度。
在最后一组数据之后,是一个零。
Output
为每组数据,分别输出原始木棒的可能最小长度,每组数据占一行。
Sample Input
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
Sample Output
6
5
http://topic.csdn.net/u/20110728/17/cdc061d8-36da-4356-b578-fd5a5274a078.html
http://topic.csdn.net/u/20110610/18/171d6808-fd2c-429c-932b-2c7ee018ea80.html
http://topic.csdn.net/u/20110608/23/70ca1838-1697-497f-9cf8-a61f33116c9a.html凑个热闹吧
import java.util.*;
class Analyzer {
public static void main(String[] args) {
int n = 10;
for (int i=1; i<n; i++) {
analyze(n, i, false); //false数字不重复,true数字可重复
}
}
public static void analyze(int sum, int num, boolean dup) {
if (num >= sum) {num = sum-1;}
if (num < 2) {
System.out.printf("%d=%d\n", sum, sum);
return;
}
int tmp = 0, row = 0;
int[] idx = new int[num];
for (int i=0; i<num-1; i++) {
if (dup) {
idx[i] = 1;
} else {
idx[i] = i+1;
}
tmp += idx[i];
}
idx[num-1] = sum-tmp;
if (!dup) {
if (idx[num-1] <= idx[num-2]) {return;}
} else {
if (idx[num-1] < 0) {return;}
} for (int i=0; i<num-1; i++) {
System.out.printf("%d+", idx[i]);
}
System.out.printf("%d=%d\n", idx[num-1], sum); while (true) {
idx[num-2]++;
for (int i=num-2; i>0; i--) {
tmp = 0;
for (int j=0; j<i; j++) {tmp+=idx[j];}
if (idx[i] > (sum-tmp)/(num-i)) {
idx[i-1]++;
}
}
if (idx[0] > sum/num) {break;}
tmp = 0;
for (int i=1; i<num-1; i++) {
tmp += idx[i-1];
if (idx[i] > (sum-tmp)/(num-i)) {
if (dup) {
idx[i] = idx[i-1];
} else {
idx[i] = idx[i-1]+1;
}
}
}
tmp = 0;
for (int i=0; i<num-1; i++) {
tmp += idx[i];
}
idx[num-1] = sum-tmp;
if (!dup) {
if (idx[num-1] <= idx[num-2]) {continue;}
} else {
if (idx[num-1] < 0) {continue;}
}
for (int i=0; i<num-1; i++) {
System.out.printf("%d+", idx[i]);
}
System.out.printf("%d=%d\n", idx[num-1], sum);
}
}
}