P1164小A点菜(动态规划)

P1164原题

题目背景

uim 神犇拿到了 uoi 的 ra(镭牌)后,立刻拉着基友小 A 到了一家……餐馆,很低端的那种。

uim 指着墙上的价目表(太低级了没有菜单),说:“随便点”。

题目描述

不过 uim 由于买了一些书,口袋里只剩 M 元 (M≤10000)。

餐馆虽低端,但是菜品种类不少,有 N 种 (N≤100),第 i 种卖 a[i] 元 (a[i]​≤1000)。由于是很低端的餐馆,所以每种菜只有一份。

小 A 奉行“不把钱吃光不罢休”,所以他点单一定刚好把 uim 身上所有钱花完。他想知道有多少种点菜方法。

由于小 A 肚子太饿,所以最多只能等待 1秒。

输入格式

第一行是两个数字,表示 N 和 M。

第二行起 N 个正数 a[i]​(可以有相同的数字,每个数字均在 1000 以内)。

输出格式

一个正整数,表示点菜方案数,保证答案的范围在 int 之内。

输入输出样例

输入 #1

4 4
1 1 2 2

输出 #1

3

说明/提示

2020.8.29,增添一组 hack 数据 by @yummy

解题思路

建立数组dp[i][j]表示前i道菜品,还剩j元的可选择方案数

动态转移方程如下:

(1)          if(j==第i道菜的价格)dp[i][j]=dp[i-1][j]+1;//由于选择吃的话只能有1种,所以直接+1

(2)          else if(j>第i道菜的价格) dp[i][j]=dp[i-1][j]+dp[i-1][j-第i道菜的价格];//一旦钱够,就可以既选择吃又可以不吃,办法数就等于吃的办法数加不吃的办法数

(3)          else if(j<第i道菜的价格) dp[i][j]=dp[i-1][j];//钱根本不够,也买不起这道菜,办法数就不增不减

题中“由于小 A 肚子太饿,所以最多只能等待 1秒”暗示TLE:-),题目最多允许1000ms。

源代码


#include<bits/stdc++.h>//万能头文件,时间太长一劳永逸地解决头文件引用不够的问题
using namespace std;//使用标准命名空间
int dp[1010][1010];//动态转移数组
int a[1010];//菜的价格
int main()
{
    int n, m;
    cin >> n >> m;//依题意
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];//输入菜价
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {

            //下列等为动态规划核心算法

            //三组动态转移方程
            if (j == a[i]) dp[i][j] = dp[i-1][j] + 1;
            if (j > a[i]) dp[i][j] = dp[i - 1][j] + dp[i - 1][j - a[i]];
            if (j < a[i]) dp[i][j] = dp[i - 1][j];
        }
    }
    cout << dp[n][m] << endl;//由于是递推,输出最后一个数组即可

    return 0;
}

相关推荐

  1. P1164A点菜动态规划

    2024-02-15 12:44:01       29 阅读
  2. P1164 A点菜

    2024-02-15 12:44:01       12 阅读
  3. 动态规划题目讲解】洛谷P8392 Uplifting Excursion

    2024-02-15 12:44:01       32 阅读
  4. P1002 过河卒:图论动态规划入门

    2024-02-15 12:44:01       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-15 12:44:01       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-15 12:44:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-15 12:44:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-15 12:44:01       20 阅读

热门阅读

  1. 15.2 OpenGL可编程片段处理:着色器执行

    2024-02-15 12:44:01       29 阅读
  2. 1837: 考试(New Online Judge)

    2024-02-15 12:44:01       38 阅读
  3. 半导体二极管

    2024-02-15 12:44:01       35 阅读
  4. 优秀网络安全运营专家的成长之路

    2024-02-15 12:44:01       33 阅读
  5. Raspbian简易RTSP服务

    2024-02-15 12:44:01       31 阅读
  6. 十三、枚举

    2024-02-15 12:44:01       28 阅读