2476: 【普及-】【P1164】小A点菜
内存限制:128 MB
时间限制:2.000 S
评测方式:文本比较
命题人:
提交:7
解决:1
题目描述
不过 uim 由于买了一些书,口袋里只剩 元 。
餐馆虽低端,但是菜品种类不少,有 种 ,第 种卖 元 。由于是很低端的餐馆,所以每种菜只有一份。
小 A 奉行“不把钱吃光不罢休”,所以他点单一定刚好把 uim 身上所有钱花完。他想知道有多少种点菜方法。
由于小 A 肚子太饿,所以最多只能等待 秒。
输入
第一行是两个数字,表示 和 。
第二行起 个正数 (可以有相同的数字,每个数字均在 以内)。
输出
一个正整数,表示点菜方案数,保证答案的范围在 int 之内。
样例输入 复制
4 4
1 1 2 2
样例输出 复制
3
提示
#include<bits/stdc++.h>
using namespace std;
int n,m,a[110];
long long ans;
void sol(int sum,int startx) {
if (sum==m) {
ans++;
return;
}else if (sum>m) {
return;
}
for (int i=startx;i<n;i++) {
sol(sum+a[i],i+1);
}
}
bool cmp(int x,int y) {
return x>y;
}
int main(){
cin>>n>>m;
for (int i=0;i<n;i++) {
cin>>a[i];
}
sort(a,a+n,cmp);
sol(0,0);
cout<<ans;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n,m,a[105],f[105][10005] = {0};
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){
f[i][j] = f[i-1][j] + 1;
}else if(a[i] > j){
f[i][j] = f[i-1][j];
}else{
f[i][j] = f[i-1][j] + f[i-1][j-a[i]];
}
}
}
cout << f[n][m];
return 0;
}