题目链接:点我
Input
本题目包含多组测试,请处理到文件结束(EOF)。 每组测试第一行包括两个正整数N和M(含义见题目描述,0<N,M<=100) 接下来有N行水果的信息,每行两个整数A,B(0<=A<=B<=100),表示至少要买该水果A个,至多只能买该水果B个。Output
对于每组测试,在一行里输出总共能够卖的方案数。 题目数据保证这个答案小于10^9Sample Input
2 3 1 2 1 2 3 5 0 3 0 3 0 3Sample Output
2 12题意:
中文题目,不多说.
思路:
动态规划中的计数问题(万恶的dp),据说可以用母函数解,可惜,还没学母函数,
代码:
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<iostream> using namespace std; int a[110],b[110]; int dp[110][110]; int main(){ int n,m; while(scanf("%d %d", &n, &m) != EOF){ for(int i = 1;i<=n;i++){ scanf("%d %d", &a[i], &b[i]); m-=a[i];b[i]-=a[i]; } memset(dp,0,sizeof(dp)); for(int i =0;i<=n;++i) dp[i][0]=1; for(int i =1;i<=n;++i) for(int j = 1;j<=m;++j) if(j-1-b[i]>=0) dp[i][j]=dp[i][j-1]+dp[i-1][j]-dp[i-1][j-1-b[i]]; else dp[i][j]=dp[i][j-1]+dp[i-1][j]; printf("%d\n",dp[n][m]); } return 0; }