AOJ 0154 - Sum of Cards

dpじゃなくてメモ化ですね.

#include<iostream>
#include<algorithm>

int a[7], b[7], m, dp[7001][7];

//次i
int rec(int n, int i){
	if(n >= 0 && i < m && dp[n][i] != -1){
		return dp[n][i];
	}

	if(n == 0){
		return 1;
	}

	if(n < 0 || i >= m){
		return 0;
	}

	int res = 0;
	for(int j=0;j<=b[i];j++){
		res += rec(n-a[i]*j, i+1);
	}

	return dp[n][i] = res;
}

int main(){
	while(std::cin >> m, m){
		for(int i=0;i<7001;i++){
			for(int j=0;j<7;j++){
				dp[i][j] = -1;
			}
		}
		for(int i=0;i<m;i++){
			std::cin >> a[i] >> b[i];
		}
		int g, n;
		std::cin >> g;
		for(;g--;){
			std::cin >> n;
			std::cout << rec(n, 0) << std::endl;;
		}
	}
}