题意:给定金钱m,求正好花完钱时购买菜的方案数
思路:取dp[i]为钱为i时的方案数,则dp[0]即没钱时方案数为1,每个菜的方案数可以由选这个菜之前的方案数相加得来,由此得状态方程dp[j] += dp[j-a[i]]
#include<bits/stdc++.h>
using namespace std;
int n, m, a[105], dp[10005];
int main()
{
while (cin >> n >> m) {
memset(dp, 0, sizeof(dp));
for (int i = 0; i < n; i++)
cin >> a[i];
dp[0] = 1;
for (int i = 0; i < n; i++)
for (int j = m; j >= a[i]; j--) {
dp[j] += dp[j-a[i]];
}
cout << dp[m] << endl;
}
}