P1164 小A点菜

题意:给出n种菜,m块钱  ,n 种菜有不同的价格,问如何组合才能让钱全部花光(要刚好花光)

    问:求花光的方案数!

思路:给出了钱跟菜品,我们可以通过枚举从每一个已经剩下的钱的状态继续枚举

    比如一开始我们剩下的钱的状态只有一个m

      在枚举第一个菜品的时候,我们可以选择买或者不买,就会多出一种状态,(m-价格)这一状态

        然后枚举第二个菜品的时候,就是建立在第一个菜品的基础上继续枚举

          以此类推,最后dp[0]的个数就是方案数

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e4+10;
 4 int dp[maxn];
 5 int vis[maxn];
 6 int a[maxn];
 7 int main()
 8 {
 9     int n,m;
10     scanf("%d%d",&n,&m);
11     for(int i=1;i<=n;i++)
12         scanf("%d",&a[i]);
13     vis[m]=1;
14     dp[m]=1;
15     for(int i=1;i<=n;i++){
16         for(int j=1;j<=m;j++){
17             if(vis[j]){
18                 if(j>=a[i])
19                     dp[j-a[i]]+=dp[j];
20                 vis[j-a[i]]=1;
21             }
22         }
23     }
24     printf("%d\n",dp[0]);
25     return 0;
26 }
View Code

 

posted @ 2020-03-27 16:19  古比  阅读(184)  评论(0编辑  收藏  举报