回朔法——数字组合问题
来源:互联网 发布:一人开十几个淘宝店 编辑:程序博客网 时间:2024/05/16 02:56
输入两个整数n和m,从数列1,2,3…n中随意取几个数,使其和等于m,要求列出所有的组合。
法一:搜索整个二叉树
static int sum=10; static int x[];//访问标记 public static void main(String[] args) { int a[]=new int[]{1,2,3,4,5,6,7,8}; x=new int[a.length]; for(int i=0;i<x.length;i++) x[i]=0; fuck(a,0); } private static void fuck(int[] a, int step) { if(step==a.length){ int temp=0; for(int i=0;i<x.length;i++) if(x[i]==1) temp+=a[i]; if(temp==sum){ for(int i=0;i<x.length;i++) if(x[i]==1) System.out.print(a[i]+","); System.out.println(); } }else{ for(int i=0;i<=1;i++){ x[step]=i; fuck(a,step+1); } } }
法二:经过优化,相当于剪枝,省去不必要的递归过程,效率更高
static int sum=10; static int currentSum=0; static int x[];//访问标记public static void main(String[] args) { int a[]=new int[]{1,2,3,4,5,6,7,8}; x=new int[a.length]; for(int i=0;i<x.length;i++) x[i]=0; fuck(a,0);} private static void fuck(int[] a, int step) { if(step==a.length){ if(currentSum==sum){ for(int i=0;i<x.length;i++) if(x[i]==1) System.out.print(a[i]+","); System.out.println(); } }else{ for(int i=0;i<=1;i++){ x[step]=i; if(i==0){ fuck(a,step+1); }else{ if(currentSum+a[step]<=sum){ //有条件的递归,这相当于剪枝,舍去不必要的递归过程 currentSum+=a[step]; fuck(a,step+1); currentSum-=a[step]; } } } } }
0 0
- 回朔法——数字组合问题
- 数字组合问题
- 数字组合问题
- 数字组合问题!
- 数字组合问题
- 数字组合问题
- LINTCODE——数字组合,数字组合II
- java解决数字组合问题
- 关于连续数字求和组合问题。
- 程序——组合问题
- LeetCode—*组合问题Combinations
- P1008 ——1:2:3数字组合
- Java基础编程1—随机生成字母数字组合
- 组合数字
- 数字组合
- 数字组合
- 数字组合
- 数字组合
- CSS实例教程:十步学会用CSS建站
- linux 下 的 atom编辑器安装
- hrbust 1473 教主的遗产【状压dp】
- 获取RecyclerView滑动的距离
- [php学习二]基本语法练习二
- 回朔法——数字组合问题
- LintCode之删除链表中的元素
- 0139 Nginx+Lua+Redis 对请求进行限制
- DWR3实现服务器端向客户端精确推送消息
- webstrom不能火狐运行网页的解决方法:设置浏览器路径
- 蓝桥杯辅导视频学习-浮点数的注意事项
- cisco交换机端口安全之端口隔离
- java字符串String(一)
- WinPcap编程——捕获数据包