原题:http://acm.hdu.edu.cn/showproblem.php?pid=2152
修改一下左右的边界范围
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int maxn = 110;
int a[110][2];
int dp[maxn*maxn], tmp[maxn*maxn];
int n, m;
int main(){
while(cin>>n>>m){
int sum = 0;
for(int i = 0;i<n;i++){
cin>>a[i][0]>>a[i][1];
sum += a[i][0];
}
if(m < sum){
cout<<"0"<<endl;
continue;
}
memset(dp, 0, sizeof dp);
memset(tmp, 0, sizeof tmp);
for(int i = a[0][0];i<=a[0][1];i++)
dp[i] = 1;
int minn = a[0][0];
for(int i = 1;i<n;i++){
for(int j = minn; j<=m;j++){
for(int k = a[i][0];k+j<=m,k<=a[i][1];k++){
tmp[k+j] += dp[j];
}
}
minn += a[i][0];
memcpy(dp, tmp, sizeof tmp);
memset(tmp, 0, sizeof tmp);
}
cout<<dp[m]<<endl;
}
return 0;
}