口袋里只剩M元(M<=10000)。菜品种类不少,有N种(N<=100),第i种卖ai元(ai<=1000)。每种菜只有一份。他点单一定要把uim身上所有钱花完。他想知道有多少种点菜方法。
输入输出格式
输入格式:
第一行是两个数字,表示N和M。
第二行起N个正数ai(可以有相同的数字,每个数字均在1000以内)。
输出格式:
一个正整数,表示点菜方案数
输入输出样例
输入样例#1:
4 4
1 1 2 2
输出样例#1:
3
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define inf 999999999 const int maxn=100005; int n,m; int dp[maxn]; //一维数组维护dp int a[maxn]; int main() { cin>>n>>m; for(int i=1; i<=n; i++)cin>>a[i]; dp[0]=1; for(int i=1; i<=n; i++) for(int j=m; j>=a[i]; j--) //价格逆序 dp[j]+=dp[j-a[i]]; //只要权值到了0,下面dp循环自然就给你加一 cout<<dp[n]; return 0; }