A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

ooyeah

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© ooyeah 初级黑马   /  2015-8-18 00:59  /  4084 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
从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



最佳答案

查看完整内容

应该没问题吧,好困,睡觉去。。。。

7 个回复

倒序浏览
  1. import java.util.HashSet;
  2. import java.util.Scanner;
  3. import java.util.Set;


  4. class combination {
  5.         static int count = 0;
  6.         public static  void combine(int index,int sum,Set<Integer> set){
  7.             if(set== null){
  8.                      set = new HashSet<Integer>();
  9.             }
  10.                 if( index  < sum/2){//递归入口,sum如果能分成两个比index都大的数则进行递归,否则此轮递归结束,回溯继续运行。
  11.                 int i = index + 1;
  12.                 int temp = 0;
  13.                 set.add(index);
  14.                 if(sum%2  ==  0){
  15.                         temp = sum /2;
  16.                 }else temp = sum/2 +1;
  17.                 count++;
  18.                 System.out.print(count+": ");
  19.             for (Integer integer : set) {
  20.                         System.out.print(integer+" ");
  21.                 }
  22.             System.out.println(sum);
  23.           
  24.                 for(;i<temp;i++){//temp为中间值,循环变量无法到达这一值,避免重复情况
  25.                         set.add(i);
  26.                         combine(i, sum-i,set);
  27.                         set.remove(i);
  28.                 }
  29.          }
  30.         else{
  31.                 set.add(index);
  32.                 set.add(sum);
  33.                 count++;
  34.                 System.out.print(count+": ");
  35.                 for (Integer integer : set) {
  36.                         System.out.print(integer+" ");                       
  37.                 }
  38.                 System.out.println();
  39.                
  40.                 set.remove(index);
  41.                 set.remove(sum);
  42.         }
  43.                
  44.         }
  45.         public static void main(String[] args) {
  46.                 int num = 20;
  47.                 for(int i=1; i <num/2; i ++){
  48.           combine(i,num-i,null);
  49.                 }
  50.         }

  51. }
复制代码


应该没问题吧,好困,睡觉去。。。。

点评

不能重复 1010不行  发表于 2015-8-18 20:02
10 10 不算吗?  发表于 2015-8-18 13:57
回复 使用道具 举报
完美解决!!!我再测试下哈
回复 使用道具 举报
本帖最后由 liuch111 于 2015-8-18 20:04 编辑
leiyingyin 发表于 2015-8-18 01:32
应该没问题吧,好困,睡觉去。。。。
写的不错 多点注释更好
回复 使用道具 举报
撸得一手好代码~~~
回复 使用道具 举报
leiyingyin 发表于 2015-8-18 00:59
应该没问题吧,好困,睡觉去。。。。

数学很好啊!我一做算法题就头疼。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马