递归算法-求所有和为10的子集

从论坛里一哥们的回复中摘来的,反正我是受教了。 
Java代码 
  1. import java.util.Stack;  
  2.   
  3. public class SubsetCalc {  
  4.   
  5.     private int[] a = { 854321 };  
  6.     private int sum = 10;  
  7.     private Stack<Integer> stack = new Stack<Integer>();  
  8.     private int stackSum = 0;  
  9.   
  10.     private void calc(int from, int to) {  
  11.         if (stackSum == sum) {  
  12.             for (Integer i : stack)  
  13.                 System.out.print(i + " ");  
  14.             System.out.println();  
  15.             return;  
  16.         }  
  17.   
  18.         for (int i = from; i < to; i++) {  
  19.             if (stackSum + a[i] <= sum) {  
  20.                 stackSum += stack.push(a[i]);  
  21.                 calc(i + 1, to);  
  22.                 stackSum -= stack.pop();  
  23.             }  
  24.         }  
  25.     }  
  26.   
  27.     public void subsets() {  
  28.         calc(0, a.length);  
  29.     }  
  30.   
  31.     public static void main(String[] args) {  
  32.         new SubsetCalc().subsets();  
  33.     }  
  34. }  

此算法有两种思路在里面。 
1.遍历过程得到了所有子集的情况; 
2.在1的基础之上得到和为10的子集。 

纠正:上面1中所说有误,应是:遍历过程得到了所有和小于等于10的所有子集的情况。 
补充:遍历所有子集的情况的代码如下 
Java代码 
  1. public class RecursionTest {  
  2.   
  3.     private int[] a={8,5,4,3,2,1};  
  4.     private Stack<Integer> stack=new Stack<Integer>();  
  5.       
  6.     private void calc(int from, int to)  
  7.     {  
  8.         for(int i=from;i<to;i++)  
  9.         {  
  10.             stack.push(a[i]);  
  11.             calc(i+1,to);  
  12.             stack.pop();  
  13.         }  
  14.         for(Integer i:stack)  
  15.         {  
  16.             System.out.print(i+" ");  
  17.         }  
  18.         System.out.println();  
  19.     }  
  20.     public void subsets()  
  21.     {  
  22.         calc(0,a.length);  
  23.     }  
  24.     public static void main(String[] args) {  
  25.         new RecursionTest().subsets();  
  26.     }  
  27. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
五大常用算法是动态规划、分治、归、贪心和回溯。 动态规划是一种将问题分解成子问题并保存子问题解的方法。通过解子问题,可以逐步推导出原始问题的解。动态规划通常用于解最优化问题,例如最长公共子序列、最短路径等。 分治是将原问题划分成多个相互独立的子问题,然后通过归的方式解子问题,并将子问题的解合并成原问题的解。分治算法常用于排序、快速幂等问题。 归是通过函数调用自身来解决问题的方法。算法在问题定义可以被分解为较小规模或更简单情况的时候很有用。例如,计算一个数的阶乘,就可以使用归实现。 贪心算法是一种选择当前最优策略的方法,即在每一步选取最优解,最终得到全局最优解的算法。贪心算法通常用于解决无后效性的问题,例如最小生成树、哈夫曼编码等。 回溯是一种通过穷举搜索所有可能的解空间,找到满足条件的解的方法。回溯算法在解决组合问题、排序问题、子集和问题等方面很有效。回溯算法通过归的方式逐步构建解,当发现当前解不满足条件时,会回退到上一步继续搜索其他可能的解。 这五种常用算法在不同的问题领域中都有广泛应用,每种算法都有自己的特点和适用范围。在解决具体问题时,可以根据问题的性质和要选择最适合的算法进行解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值