• 递推与递归


    public class HelloWorld {
    	public static void main(String[] args) {
    	
    	    
    	}
    	
    	/**
    	 *  机器人走格子
    	 *  (x,y) 表示目标点,只能向右或者向下走
    	 * 题目大意就是求(0,0)到(x,y)有多少种走法
    	 * f(x,y)=f(x-1,y)+f(x,y-1);
    	 */
    	 // 递归版本
    	 static int solve(int x,int y){
    	     if(x==1||y==1) return 1;
    	     
    	     return solve(x-1,y)+solve(x,y-1);
    	 }
    	 // 迭代版
    	 // m 表示行数,n 表示列数
    	 static int solve1(int m,int n){
    	     int[][] map = new int[m+1][n+1];
    	     //将第二行全置1
    	     for (int i=1;i<=n ;i++ ){
    	         map[1][i] =1;
    	     } 
    	     // 将第二列全置1
    	     for (int j=1;j<=m ;j++ ){
    	         map[j][1] =1;
    	     } 
    	     //利用递推公式赋值
    	     for (int i=2;i<=m ;i++ ){
    	         for (int j=2;j<=n ;j++ ){
    	             map[i][j] = map[i-1][j]+map[i][j-1];
    	         } 
    	     }
    	     return map[m][n];
    	     
    	 }
    	 
    	 /**
    	  *  硬币面值问题
    	  *  给定 1 5 10 25  求 n 组合种数
    	  * 
    	  * 思路:递推无法解决,只能进行枚举,而枚举思路先从大面值开始取,
    	  *     算出大面值可举次数,然后依次递归选取小面值
    	  */
    	  
    	 static int countWays(int n){
    	     if(n<=0) return 0;
    	     //面值数组
    	     int[] value ={1,5,10,25};
    	     return countWaysCore(n,value,value.length-1);
    	 } 
    	 // cur 表示 所取面值数组下标
    	 static int countWaysCore(int n,int[] coins,int cur){
    	     if(cur ==0) return 1;
    	     int result = 0;
    	     int counts_cur = n/coins[cur];//n 在当前面值下可选择次数
    	     for (int i=0;i<=counts_cur ;i++ ){
    	         int last = n-i*coins[cur];
    	         result = result + countWaysCore(last,coins,cur-1);
    	     }
    	     return result;
    	 }
    	 
    	 
    }
    
  • 相关阅读:
    小程序云开发学习笔记
    188.gulp创建任务
    187.gulp介绍和安装
    186.npm使用详解
    185.nvm和node.js环境配置
    171.补充-在模板中添加权限控制
    170.分组-group、permission、user的操作
    内置中间件CommonMiddleware
    Django内置的中间件
    144.中间件的原理和定义方式详解
  • 原文地址:https://www.cnblogs.com/Qvolcano-blog/p/14618505.html
Copyright © 2020-2023  润新知