题意理解:
假设你正在爬楼梯。需要 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)