小A点菜 ###K //K

题目链接:https://www.luogu.com.cn/problem/P1164
思路:f[i][j] 代表 前i道钱 刚好花费j元 所能得到的方案数

那么每道菜可以有吃和不吃两种选择, 因为是方案数,所以是由前面的累加而得到

不吃的花 那么方案数f[i][j]+=f[i-1][j] 如果吃的话就是 f[i][j]+=f[i-1][j-a[i]]  注意j==a[i]时方案数数要加1 所以将所有的f[i][0] 初始化为1

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define pb push_back
 5 const int mod=998244353;
 6 const int maxn=1e3+10;
 7 int a[maxn];
 8 int dp[maxn][maxn];
 9 
10 
11 
12 
13 int main()
14 {
15     ios::sync_with_stdio(0);
16     cin.tie(0);
17     int n,m;
18     cin>>n>>m;
19     for(int i=1;i<=n;i++)
20     {
21         cin>>a[i];
22     }
23     for(int i=0;i<=n;i++)
24         dp[i][0]=1;
25     for(int i=1;i<=n;i++)
26     {
27         for(int j=1;j<=m;j++)
28         {
29             dp[i][j]+=dp[i-1][j];
30             if(j>=a[i])
31                 dp[i][j]+=dp[i-1][j-a[i]];
32         }
33     }
34     cout<<dp[n][m]<<'\n';
35 
36 
37 }
View Code

 

posted @ 2020-11-17 18:37  canwinfor  阅读(108)  评论(0)    收藏  举报