我最薄弱的方面就是DP了,之前一直很害怕DP,从今天开始就攻一攻DP吧,先把以前做的复习一遍
分析: 1.如果当前的余额i恰好能够点这道菜,那么金额为i时的点菜方式增加1
2.如果当前的余额i点完这道菜还有剩余,那么金额为i时的点菜方式增加不点这道菜时的方式
所以得到递推式dp[j] = 1.dp[j]+1 (j=temp) 2.dp[j] + dp[j-temp] (j > temp)
#include <cstdio>
#include <iostream>
using namespace std;
const int maxn = 10000+10;
int N, M, dp[maxn];
int main() {
int temp;
cin >> N >> M;
for(int i = 1; i <= N; i++) {
cin >> temp;
for(int j = M; j >= temp; j--) {
if(j - temp == 0) dp[j]++;
dp[j] += dp[j-temp];
}
}
cout << dp[M];
return 0;
}