小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 }

浙公网安备 33010602011771号