当前位置: 首页 > news >正文

题解:洛谷 P1164 小A点菜

【题目来源】

洛谷:P1164 小A点菜 - 洛谷 (luogu.com.cn)

【题目描述】

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

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

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

餐馆虽低端,但是菜品种类不少,有 \(N\)\((N\le 100)\),第 \(i\) 种卖 \(a_i\)\((a_i\le 1000)\)。由于是很低端的餐馆,所以每种菜只有一份。

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

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

【输入】

第一行是两个数字,表示 \(N\)\(M\)

第二行起 \(N\) 个正数 \(a_i\)(可以有相同的数字,每个数字均在 \(1000\) 以内)。

【输出】

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

【输入样例】

4 4
1 1 2 2

【输出样例】

3

【解题思路】

image

image

【算法标签】

《洛谷 P1164 小A点菜》 #动态规划,dp# #搜索# #背包# #洛谷原创#

【代码详解】

#include <bits/stdc++.h>
using namespace std;int n, m;           // n-物品数量,m-目标和
int a[105];         // 存储每个物品的数值
int f[105][10005];  // DP数组,f[i][j]表示前i个物品组成j的方案数int main() 
{// 输入物品数量和目标和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 (a[i] == j)                // 情况1:当前物品值正好等于目标和f[i][j] = f[i-1][j] + 1;   // 方案数=不选它的方案数+只选它的方案(1种)else if (a[i] > j)          // 情况2:当前物品值大于目标和f[i][j] = f[i-1][j];       // 不能选它,方案数等于前i-1个物品的方案数else                        // 情况3:当前物品值小于目标和f[i][j] = f[i-1][j] + f[i-1][j-a[i]];  // 方案数=不选它的方案数+选它的方案数}}// 输出前n个物品组成m的方案数cout << f[n][m];return 0;
}
// 使用记忆化DFS再写一遍
#include <bits/stdc++.h>
using namespace std;int n, m;           // n-物品数量,m-目标和
int a[105];         // 存储每个物品的数值
int used[105];      // 标记物品是否被使用
int dp[105][10005]; // 记忆化数组,dp[step][s]表示从step开始选,当前和为s的方案数// 记忆化DFS函数
int dfs(int step, int s) 
{int ans = 0;// 边界条件1:当前和超过目标值if (s > m) return 0;// 记忆化:如果已经计算过,直接返回结果if (dp[step][s]) return dp[step][s];// 边界条件2:已经考虑完所有物品if (step == n) {if (s == m) return 1;  // 找到一种方案return 0;}// 选择当前物品used[step] = 1;ans += dfs(step + 1, s + a[step]);used[step] = 0;// 不选择当前物品ans += dfs(step + 1, s);// 存储计算结果return dp[step][s] = ans;
}int main() 
{// 输入物品数量和目标和cin >> n >> m;// 输入每个物品的数值for (int i = 0; i < n; i++) cin >> a[i];// 初始化记忆化数组(全局变量自动初始化为0)memset(dp, 0, sizeof(dp));memset(used, 0, sizeof(used));// 从第0个物品开始,当前和为0cout << dfs(0, 0);return 0;
}

【运行结果】

4 4 
1 1 2 2
3
http://www.jsqmd.com/news/389943/

相关文章:

  • 深入解析:Hologres Dynamic Table 在淘天价格力的业务实践
  • 题解:洛谷 P1464 Function
  • 标准 Hough 变换、修正 Hough 变换和序列 Hough 变换三种典型航迹起始算法研究附Matlab代码
  • 交稿前一晚!8个降AIGC工具测评:自考降AI率必备攻略
  • 差分进化算法(DE)与缩放因子自适应差分进化(SHADE)在CEC2005函数寻优中的性能研究附Matlab代码
  • 这次终于选对!8个AI论文平台测评:本科生毕业论文写作必备工具推荐
  • WOA-SVM时序预测模型研究——基于鲸鱼优化算法的支持向量机时序预测方法附Matlab代码
  • 表贴式PMSM的直接转矩控制(DTC)仿真模型附Simulink仿真
  • 比较CVaR最优投资组合与均值-方差投资组合以及其他模型,包括全局最小方差(GMVP)和市场投资组合附Matlab代码
  • 这次终于选对!8个一键生成论文工具:自考毕业论文+开题报告高效写作测评
  • 题解:洛谷 P1028 [NOIP 2001 普及组] 数的计算
  • 2026年IEEE IOTJ SCI2区TOP,面向关键节点感知的灾害区域无人机集群路径规划,深度解析+性能实测
  • 2026年上班族香港优才靠谱品牌指南:从政策落地到全周期服务对比 - 速递信息
  • 采用单极表面电荷密度方法数值计算长且均匀磁化圆柱体极尖间气隙的磁场,并与类似点磁单极的近似方法进行比较附Matlab代码
  • 题解:洛谷 P1044 [NOIP 2003 普及组] 栈
  • 超级创新【物流中心选址】基于企鹅优化算法在物流中心选址的应用附Matlab代码
  • 新手也能上手 10个降AI率软件降AIGC网站:继续教育必备工具深度测评与推荐
  • 救命神器 10个AI论文写作软件测评:专科生毕业论文+开题报告高效写作指南
  • 探索三相交错并联Buck电路双闭环控制的MATLAB/Simulink仿真之旅
  • 【8*】WQS二分学习笔记
  • 题解:洛谷 P2036 [COCI 2008/2009 #2] PERKET
  • 2026年考察升降平台工厂,重点关注这些核心指标,翻转平台/装车平台/自行走升降机/移动登车桥,升降平台厂商推荐榜 - 品牌推荐师
  • 不踩雷!继续教育降AI率工具 —— 千笔·专业降AIGC智能体
  • 照着用就行:千笔AI,抢手爆款的AI论文写作软件
  • [嵌入式系统-231]:传感器:模拟信号检测
  • 题解:洛谷 P1002 [NOIP 2002 普及组] 过河卒
  • 定稿前必看!AI论文网站 千笔AI VS 锐智 AI,专科生专属神器!
  • 实测才敢推!最强的降AI率平台 —— 千笔·降AIGC助手
  • 专科生收藏!千笔,普遍认可的AI论文平台
  • 残疾人代步车辅助避障,小型车视觉避障,室内外通行,输出安全行驶。