P1164 小A点菜
题目背景
uim
神犇拿到了uoi
的ra
(镭牌)后,立刻拉着基友小A
到了一家……餐馆,很低端的那种。
uim
指着墙上的价目表(太低级了没有菜单),说:“随便点”。
题目描述
不过uim
由于买了一些书,口袋里只剩MM元(M \le 10000)(M≤10000)。
餐馆虽低端,但是菜品种类不少,有NN种(N \le 100)(N≤100),第ii种卖a_iai元(a_i \le 1000)(ai≤1000)。由于是很低端的餐馆,所以每种菜只有一份。
小A
奉行“不把钱吃光不罢休”,所以他点单一定刚好把uim
身上所有钱花完。他想知道有多少种点菜方法。
由于小A
肚子太饿,所以最多只能等待11秒。
输入格式
第一行是两个数字,表示NN和MM。
第二行起NN个正数a_iai(可以有相同的数字,每个数字均在10001000以内)。
输出格式
一个正整数,表示点菜方案数,保证答案的范围在intint之内。
输入输出样例
输入 #1
4 4 1 1 2 2
输出 #1
3
1 #include <iostream> 2 #include<string.h> 3 using namespace std; 4 int arr[101][10001]; //arr为吃了i道菜花光j元钱的办法数 5 int main() { 6 //a为菜的价格, 7 int n, m, a[101]; 8 cin >> n >> m; 9 for (int i = 1;i <= n;++i) 10 cin >> a[i]; 11 for (int i = 1;i <= n;++i) 12 for (int j = 1;j <= m;++j){ 13 //如果钱刚好够,则办法数为吃前一道菜的办法数+1 14 if (j == a[i]) 15 arr[i][j] = arr[i - 1][j] + 1; 16 //如果钱还有剩余,办法总数就等于吃这道菜的办法数与不吃这道菜的办法数之和 17 if (j > a[i]) 18 arr[i][j] = arr[i - 1][j] + arr[i - 1][j - a[i]]; 19 //如果钱不够,回到前一步 20 if (j < a[i]) 21 arr[i][j] = arr[i - 1][j]; 22 } 23 //最后一步即为所有点菜方法数的总和 24 cout << arr[n][m]; 25 26 return 0; 27 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律