洛谷:P1164:小A点菜


洛谷:P1164:小A点菜

Table of Contents

题目

P1164:小A点菜

分析

这是一道DP的题目。我们用dp[i][j]表示选到第i道菜,总价恰好为j的方案数。

状态转移就是考虑在第i道菜(对应价格prices[i]),有两种情况:

  1. 不选这道菜dp[i][j] = dp[i-1][j]。总价为j的方案完全来自前i-1道菜。
  2. 选这道菜:若j >= prices[i],则dp[i][j] += dp[i-1][j - prices[i]]。即前i-1道菜凑出j - prices[i],再加上prices[i],总价恰为j
  3. 综合两种情形:dp[i][j] = dp[i-1][j] + dp[i-1][j - prices[i]](当j >= prices[i]时)。

初始条件:dp[0][0] = 1,表示考虑0道菜时总价为0的方案数为1(什么都不选)。最终答案为dp[N][M]

答案

Solution

思考

我们用的是标准的二维DP数组。本题还可以用一维数组压缩,但需要注意凑金额时循环的方向。请读者参考上图中的代码自行思考。

Previous Next