题目描述
小A口袋里只剩 M 元 (M≤10000),来到一家餐馆点菜吃饭。
餐馆有 N(N≤100) 种菜品,但每种菜只有一份,其中第 i 种售价 ai 元 (ai≤1000) 。
小A奉行 “不把钱花光就不罢休” 的原则,所以他点的菜一定刚好把身上的所有钱花完。
他想知道有多少种点菜方法。
输入格式
第一行是两个数字,表示 N 和 M。
第二行起 N 个正整数 ai(可以有相同的数字,每个数字均在 1000 以内)。
输出格式
一个正整数,表示点菜方案数,保证答案的范围在 int
之内。
样例 #1
样例输入 #1
4 4
1 1 2 2
样例输出 #1
3
#include <iostream>
#include <cstring>
using namespace std;int c[110];
long long dp[110][10010];
long long dfs(int n,int t)
{if(n==0&&t==0)return 1;if(n==0)return 0;long long &d=dp[n][t];if(d!=-1)return d;d=dfs(n-1,t);if(t>=c[n])d+=dfs(n-1,t-c[n]);return d;
}
int main()
{int n,t;cin>>n>>t;for(int i=1;i<=n;i++)cin>>c[i];memset(dp,-1,sizeof(dp));cout<<dfs(n,t);return 0;
}
看似是dfs,其实这是DP,记忆化搜索,DP本来就是一种递归思想的加强。注意检查long long时不放过任何一个int!