Kamacoder 57 爬楼梯(第八期模拟笔试)

题意理解

        假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 

        每次你可以爬至多m (1 <= m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢? 

        注意:给定 n 是一个正整数。

        这里把顶楼等价于target

        把[0,1,2,3,4,...,n]看作元素集合,且每个元素可以使用无限次

        所以这个问题是一个完全背包问题。

解题思路

        target=楼顶n

        元素=[0,1,2,...m],使用元素来凑target有多少种方式

        这里有: 1+2+1  和1+1+2 是两种方式,所以这里求得应该是排序数

        注意:此处求排列数,双for循环得顺序应该是:先背包后物品

        且双for循环的遍历顺序不能调换。先物品后背包求的是组合数。

1.动态规划解题



import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Main obj=new Main();
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int m=sc.nextInt();
        System.out.println(obj.clamb(n,m));
    }

    public int clamb(int n,int m){
        int[] dp=new int[n+1];
        Arrays.fill(dp,0);
        dp[0]=1;
        for(int j=1;j<=n;j++){//遍历背包
            for(int i=1;i<=m;i++){
                if(j>=i){
                    dp[j]+=dp[j-i];
                }
            }
        }
        return dp[n];
    }
}


2.分析

时间复杂度:O(n^2)

空间复杂度:O(n)

你可能感兴趣的:(刷题训练营,java,算法)