P1164 小A点菜

题目背景

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

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

题目描述

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

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

小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 }

 

posted @ 2022-01-27 23:17  葛杨杨  阅读(81)  评论(0编辑  收藏  举报