AOJ0154 Sum of Cards

問題リンク Sum of Cards

  • 解法

部分問題に落とせます。
dp[i][N]: i番目までの種類のカードを使って、数Nを実現する組み合わせ数
カードiの番号がvだとするとi番目のカードを使うことで新たに数Nを表現する方法はdp[i-1][N-v]通り増えます。

  • ソース
import java.util.Scanner;

//Sum of Cards
public class AOJ0154 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(true){
			int m = sc.nextInt();
			if(m==0)break;
			int[] v = new int[m+1];
			int[] num = new int[m+1];
			for(int i=1;i<=m;i++){
				v[i] = sc.nextInt();
				num[i] = sc.nextInt();
			}
			int[][] dp = new int[m+1][1001];
			dp[0][0] = 1;
			for(int i=1;i<=m;i++){
				for(int k=0;k<1001;k++){
					for(int s=0;s<=num[i];s++){
						if(k-v[i]*s<0)break;
						dp[i][k] += dp[i-1][k-s*v[i]];
					}
				}
			}
			int g = sc.nextInt();
			while(g--!=0)System.out.println(dp[m][sc.nextInt()]);
		}
	}
}