黑马程序员技术交流社区
标题: 求一个整数的所有相加组合情况 [打印本页]
作者: ooyeah 时间: 2015-8-18 00:59
标题: 求一个整数的所有相加组合情况
从1开始,求一个整数的所有相加组合情况,相加的数不能相同,组合不能重复(即调换顺序不算)
例如:整数20,求组合相加等于20的情况:
1 19
1 2 17
1 2 3 14
1 2 3 4 10
1 2 3 5 9
1 2 3 6 8
1 2 4 13
.
.
.
7 13
8 12
9 11
作者: leiyingyin 时间: 2015-8-18 00:59
- import java.util.HashSet;
- import java.util.Scanner;
- import java.util.Set;
- class combination {
- static int count = 0;
- public static void combine(int index,int sum,Set<Integer> set){
- if(set== null){
- set = new HashSet<Integer>();
- }
- if( index < sum/2){//递归入口,sum如果能分成两个比index都大的数则进行递归,否则此轮递归结束,回溯继续运行。
- int i = index + 1;
- int temp = 0;
- set.add(index);
- if(sum%2 == 0){
- temp = sum /2;
- }else temp = sum/2 +1;
- count++;
- System.out.print(count+": ");
- for (Integer integer : set) {
- System.out.print(integer+" ");
- }
- System.out.println(sum);
-
- for(;i<temp;i++){//temp为中间值,循环变量无法到达这一值,避免重复情况
- set.add(i);
- combine(i, sum-i,set);
- set.remove(i);
- }
- }
- else{
- set.add(index);
- set.add(sum);
- count++;
- System.out.print(count+": ");
- for (Integer integer : set) {
- System.out.print(integer+" ");
- }
- System.out.println();
-
- set.remove(index);
- set.remove(sum);
- }
-
- }
- public static void main(String[] args) {
- int num = 20;
- for(int i=1; i <num/2; i ++){
- combine(i,num-i,null);
- }
- }
- }
复制代码
应该没问题吧,好困,睡觉去。。。。
作者: leiyingyin 时间: 2015-8-18 01:24
完美解决!!!我再测试下哈
作者: liuch111 时间: 2015-8-18 20:01
本帖最后由 liuch111 于 2015-8-18 20:04 编辑
写的不错 多点注释更好
作者: ooyeah 时间: 2015-8-18 22:19
撸得一手好代码~~~
作者: JOKER0819 时间: 2015-8-28 22:45
数学很好啊!我一做算法题就头疼。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |