P1164 小A点菜
题意:给出n种菜,m块钱 ,n 种菜有不同的价格,问如何组合才能让钱全部花光(要刚好花光)
问:求花光的方案数!
思路:给出了钱跟菜品,我们可以通过枚举从每一个已经剩下的钱的状态继续枚举
比如一开始我们剩下的钱的状态只有一个m
在枚举第一个菜品的时候,我们可以选择买或者不买,就会多出一种状态,(m-价格)这一状态
然后枚举第二个菜品的时候,就是建立在第一个菜品的基础上继续枚举
以此类推,最后dp[0]的个数就是方案数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }