关于动态规划【完全背包的相关问题】

(以下问题逻辑上串行,每个问题都随上一个问题的回答而提问)

问题一:纯粹的完全背包问题,问装满这个背包的最大价值。两层for循环是否可以颠倒?

回答一:可以

问题二:完全背包在不同场景下,问装满这个背包有多少种方法。两层for循环是否可以颠倒?不同场景下应该先遍历什么后遍历什么?

回答二:要根据实际问题解决,要看题目需要求的是组合数还是排列数,不能随意颠倒。如果是要求组合数,不能颠倒,要先遍历物品后遍历背包;如果是要求排列数,不能颠倒,要先遍历背包后遍历物品

问题三:先给一道标准的爬楼梯问题,一步只能爬一个和两个台阶,问爬完这个楼梯有多少种方法?

回答三:递推公式是那个:dpi = dpi-1 + dpi-2;(力扣70.爬楼梯)(代码见下图1)

问题四:如果一步可以爬m步的话,爬到楼顶有多少种方法?

回答四:(动态规划的完全背包应用)(卡码网57.爬楼梯)(代码见下图2)

问题五:你求的是排列数还是组合数?

回答五:排列数

问题六:那你的这个遍历顺序可不可以颠倒?

回答六:不能

问题七:如果颠倒的话,求的是什么场景?

回答七:求组合数(场景例如:力扣518.零钱兑换II)(代码如下图3)

问题八:如果不颠倒的话,求的是什么场景?

回答八:求排列数(场景例如:377.组合总和IV)(代码如下图4)

图1如下所示:

图2如下所示:

图3如下所示:

图4如下所示: