算法——排列组合篇02
来源:互联网 发布:牛排一份多少钱 知乎 编辑:程序博客网 时间:2024/06/10 07:29
问题:
输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来
考虑一下,该怎么解决。
举例说明:
当m=5,n=4时,所有的组合为14,23
当m=6,n=5时,所有的组合为15,24,123
方法一:
遍历整个数列,从1开始,一直到n,在遍历的过程中,递归调用本方法,传入当前元素的值并+sum(初始值为0),当sum的值刚好等于m时,就打印遍历的结果。然后返回上次递归过程,继续处理下一步的执行。
整体的结构就是一个for(){}循环,再循环的内部,传入参数,继续调用本方法。直到条件满足,便打印。。
package hello.ant;//递归回溯public class Alog_PL_ZH3 {static int m=10,n=10;public static void main(String[] args) {int result[]=new int[n];long startTime=System.currentTimeMillis();findResult(result, 0, 0, 0);long endTime=System.currentTimeMillis();System.out.println("****"+(endTime-startTime)/1000.0);}static void findResult(int result[],int begin,int index,int sum){if(sum>m){return ;}else if(sum==m){for(int i=0;i<index;i++){System.out.print(result[i]);}System.out.println();}else {for(int i=begin;i<n;i++){result[index]=i+1;//i+1表示数列对应的元素值findResult( result, i+1, index+1, sum+i+1);}}}}
方法二:(参考了他人的思路)
背包的思想:
f(m,n)的组合情况,包含n的情况,
若将n放入背包中,那么背包的组成就为f(m-n,n-1)+n,这里的n-1,代表着元素的下标,相等于前面背包问题里面所说的物品数量,如果不将n放入背包,背包的组成就为f(m,n-1),用这种模拟的意思,来解释这种方法是什么思路。。。
代码如下:
package hello.ant;import java.util.Stack;public class Alog_PL_ZH4 {static Stack<Integer> stack=new Stack<Integer>();public static void main(String[] args) {int m=10,n=10;findResult(m,n);}static void findResult(int m,int n) {if(m<1||n<1){return;}if(m==n){printStack();System.out.println(n);}stack.add(n);findResult(m-n, n-1);stack.pop();findResult(m, n-1);}static void printStack(){for(Integer x:stack){System.out.print(x+" ");}}}
结果:
10
9 1
8 2
7 3
7 2 1
6 4
6 3 1
5 4 1
5 3 2
4 3 2 1
0 0
- 算法——排列组合篇02
- 算法——排列组合篇01
- 程序员必备算法——排列组合
- STL源码剖析——STL算法之permutation排列组合
- 算法——递归思想解决排列组合问题
- 直通BAT算法面试——排列组合、概率
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 原程序自动生成 ----- static class Program
- Android学习笔记(2)————Android四大组件之二(Service )
- [连载]Java程序设计(01)---任务驱动方式:英制单位转换成公制单位
- 第 4 章表达式和基本语句索引
- 【Misc】OpenID(认证协议):authenrication OAuth(授权协议):authorization
- 算法——排列组合篇02
- 算法java实现--回溯法--批处理作业调度问题
- [BASIC-10] 十进制转十六进制
- 进程通信-----共享内存
- 语法糖汇总
- android中的日期和时间组件
- Linux网络编程下UDP洪水攻击实例介绍
- 3.2 简单的Windows 应用程序命名规则
- Javascript变量名混淆细节