目录

1 问题描述

2 解决方案


1 问题描述

输入两个整数n和sum,要求从数列1,2,3,...,n中随意取出几个数,使得它们的和等于sum,请将其中所有可能的组合列出来。


2 解决方案

上述问题是典型的背包问题的应用,即先找出n个数的所有组合,再在这些组合中寻找组合数相加之和等于sum的组合,并依次输出这些组合中的数。

具体代码如下:

  1. package com.liuzhen.array_2;
  2.  
  3. public class ManySumN {
  4. /*
  5. * 函数功能:以字符串形式返回1~n个数的所有子集,其中0代表不包含其中数字i,1代表 包含其中数字i
  6. * 此段代码是运用反射格雷码的思想,具体解释详见:算法笔记_019:背包问题(Java)
  1. */
  2. public String[] getAllGroup(int n){
  3. int len = (int) Math.pow(2, n);
  4. String[] result = new String[len];
  5. if(n == 1){
  6. result[0] = "0";
  7. result[1] = "1";
  8. return result;
  9. }
  10. String[] temp = getAllGroup(n-1);
  11. for(int i = 0;i < temp.length;i++){
  12. result[i] = "0" + temp[i];
  13. result[len-1-i] = "1" + temp[i];
  14. }
  15. return result;
  16. }
  17. /*
  18. * 参数n:代表有1~n的n个不同整数
  19. * 函数功能:打印出1~n中所有随机组合的几个数,其相加的和等于sum
  20. */
  21. public void printManySumN(int n,int sum){
  22. System.out.println("1~"+n+"个数中,相加之和等于"+sum+"的所有组合数为:");
  23. String[] allGroup = getAllGroup(n);
  24. for(int i = 0;i < allGroup.length;i++){
  25. char[] temp = allGroup[i].toCharArray();
  26. int tempSum = 0;
  27. for(int j = 0;j < temp.length;j++){
  28. if(temp[j] == '1')
  29. tempSum += (j+1);
  30. }
  31. if(tempSum == sum){
  32. for(int j = 0;j < temp.length;j++){
  33. if(temp[j] == '1')
  34. System.out.print((j+1)+" ");
  35. }
  36. System.out.println();
  37. }
  38. }
  39. }
  40.  
  41. public static void main(String[] args){
  42. ManySumN test = new ManySumN();
  43. test.printManySumN(10, 16);
  44. }
  45. }

运行结果:

  1. 1~10个数中,相加之和等于16的所有组合数为:
  2. 7 9
  3. 6 10
  4. 4 5 7
  5. 3 4 9
  6. 3 5 8
  7. 3 6 7
  8. 2 3 5 6
  9. 2 3 4 7
  10. 2 4 10
  11. 2 5 9
  12. 2 6 8
  13. 1 2 6 7
  14. 1 2 5 8
  15. 1 2 4 9
  16. 1 2 3 4 6
  17. 1 2 3 10
  18. 1 3 5 7
  19. 1 3 4 8
  20. 1 4 5 6
  21. 1 5 10
  22. 1 6 9
  23. 1 7 8

算法笔记_041:寻找和为定值的多个数(Java)的更多相关文章

  1. 算法笔记_037:寻找和为定值的两个数(Java)

    目录 1 问题描述 2 解决方案 2.1 排序夹逼法   1 问题描述 输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数.如果有多对数的和等于输入的整数,输出任意一对即 ...

  2. 在数组中寻找和为定值的n个数

    /*-------------------------------------------------------*/ /*寻找和为定值的两个数 输入一个数组A[0,N-1]和一个数字Sum,在数组中 ...

  3. Java实现寻找和为定值的多个数

    1 问题描述 输入两个整数n和sum,要求从数列1,2,3,-,n中随意取出几个数,使得它们的和等于sum,请将其中所有可能的组合列出来. 2 解决方案 上述问题是典型的背包问题的应用,即先找出n个数 ...

  4. 算法笔记_035:寻找最小的k个数(Java)

    目录 1 问题描述 2 解决方案 2.1 全部排序法 2.2 部分排序法 2.3 用堆代替数组法 2.4线性选择算法   1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 ...

  5. 算法笔记_031:计算中值和选择问题(Java)

    目录 1 问题描述  2 解决方案 2.1 计算中值问题 2.2 选择问题   1 问题描述 中值问题是求一个n个数列表中某一数组下标k,它要求该下标元素比列表中的一半元素大,又比另一半元素小,这个中 ...

  6. 窥探算法之美妙——寻找数组中最小的K个数&python中巧用最大堆

    原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情 ...

  7. 算法笔记_077:蓝桥杯练习 K好数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4, ...

  8. 算法笔记_061:蓝桥杯练习 字串统计(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然 ...

  9. 算法笔记_192:历届试题 买不到的数目(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 小明开了一家糖果店.他别出心裁:把水果糖包成4颗一包和7颗一包的两种.糖果不能拆包卖. 小朋友来买糖的时候,他就用这两种包装来组合.当然有 ...

随机推荐

  1. [CC-ANUGCD]Maximum number, GCD condition

    [CC-ANUGCD]Maximum number, GCD condition 题目大意: 一个长度为\(n(n\le10^5)\)的数列\(A(A_i\le10^5)\),\(m(m\le10^5 ...

  2. Problem G: 切煎饼

    Description 王小二自夸刀工不错,有人放一张大的圆煎饼在砧板上,问他:饼不允许离开砧板,切100刀最多能切多少块? Input 多组测试数据,每组输入1个整数,代表切的刀数 Output 每 ...

  3. [bzoj1025][SCOI2009]游戏 (分组背包)

    Description windy学会了一种游戏.对于1到N这N个数字,都有唯一 且不同的1到N的数字与之对应.最开始windy把数字按顺序1,2,3,……,N写一排在纸上.然后再在这一排下面写上它们 ...

  4. bzoj 1115: [POI2009]石子游戏Kam -- 博弈论

    1115: [POI2009]石子游戏Kam Time Limit: 10 Sec  Memory Limit: 162 MB Description 有N堆石子,除了第一堆外,每堆石子个数都不少于前 ...

  5. Android ConstraintLayout约束控件链接整理

    Android新特性介绍,ConstraintLayout完全解析 探索Android ConstraintLayout布局 了解使用Android ConstraintLayout

  6. [制作实践]一种基于LM2576的多功能开关电源设计

    http://bbs.kechuang.org/read-kc-tid-9837-page-e.html 摘要:本文介绍了一种性价比高.功能丰富的程控开关电源的设计,对基于LM2576控制核心的升.降 ...

  7. Struts2 @ResultPath注释示例

    在Struts 2中, @ResultPath 注解用于控制Struts2找到存储的结果或JSP页面.默认情况下,它会找到结果页在 “WEB-INF/content/” 文件夹. 不知道为什么在Str ...

  8. python笔记22-literal_eval函数处理返回json中的单双引号

    前言 在做接口测试的时候,最常见的接口返回数据就是json类型,json类型数据实际上就是字串,通常标准的json格式是可以转化成python里面的对应的数据类型的 有时候开发返回的数据比较坑,不按常 ...

  9. sqlite3 支持的关联查询

    1.支持多表连接,例如 select * from student,class where student.cid=class.id; 2.支持左外连接(left outer join) 例如: se ...

  10. iOS:CoreData数据库的使用四(数据库和UITableViewController以及NSFetchedResultsController一起使用)

    CoreData数据库虽然可以和tableview或者UITableViewController一起使用将数据显示在表格上,但是在准备数据的时候,这种方式需要用一个可变数组来装从数据库一次性取出来的所 ...