Problem:
カードの組み合わせ

整数が書いてあるカードが何枚か入っている袋を使ってゲームをしましょう。各回のゲームで参加者はまず、好きな数 n を一つ宣言します。そして、袋の中から適当な枚数だけカードを一度に取り出して、それらのカードに書かれた数の総和が n に等しければ豪華賞品がもらえます。なお、それぞれのゲーム終了後カードは袋に戻されます。

袋の中の m 種類のカードの情報および、g 回のゲームで参加者が宣言した数を入力とし、それぞれのゲームで豪華商品をもらえるカードの組み合わせが何通りあるかを出力するプログラムを作成してください。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。
各データセットは以下の形式で与えられます。

m
a1 b1
a2 b2
:
am bm
g
n1
n2
:
ng

１行目にカードの種類数 m （1 ≤ m ≤ 7）、続く m 行に i 種類目のカードに書かれた整数 ai (1 ≤ ai ≤ 100) とその枚数 bi (1 ≤ bi ≤ 10) が空白区切りで与えられます。

続く行にゲームの回数 g (1 ≤ g ≤ 10)、続く g 行にゲーム i で宣言された整数 ni (1 ≤ ni ≤ 1,000) が与えられます。

データセットの数は 100 を超えない。

Output

入力データセットごとに、i 行目にゲーム i で豪華賞品がもらえるカードの組み合わせ数を出力します。

Sample Input

5
1 10
5 3
10 3
25 2
50 2
4
120
500
100
168
7
1 10
3 10
5 10
10 10
25 10
50 10
100 10
3
452
574
787
0

Output for the Sample Input

16
0
12
7
9789
13658
17466

Solution in C (judge verdict: Wrong Answer)

/*
AizuOnline A0154
Title
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
//grobal vars;
struct card_inf {int val;
  int cnt;} card[7];
int m;
int g;
int cc;
int minval;
//
int comp(void *x,void *y)
{
  return(((struct card_inf *)y)->val - ((struct card_inf *)x)->val);
}
void printks(struct card_inf c[7],int least_coin)
{
  int i;

  printf("---------------\n");
  for(i=0;i<m-1;i++)
    printf("|%d %d\n",card[i].val,card[i].cnt-c[i].cnt);
  printf("|%d %d\n",minval,least_coin);
}
void printks2(struct card_inf c[7])
{
  int i;
  printf("---------------\n");
  for(i=0;i<m;i++)
    printf("|%d %d\n",card[i].val,card[i].cnt-c[i].cnt);
}

void search(struct card_inf c[7],int total,int maxval)
{
  int i,j;

  struct card_inf c1[7];
#ifdef DEBUG
  printf("\nT,M %d %d::",total,maxval);  
  for(i=0;c[i].val;i++)
    printf("%d %d:",(c[i].val),(c[i].cnt));
#endif 
  for(i=0;i < m;i++)
    {
      if(c[i].val > maxval)
	continue;
      
      if(c[i].val==minval && (total % minval)==0 && c[i].cnt >= (total/minval))
	{
	  c[i].cnt--;
	  cc++;
#ifdef DEBUG
	  printf("+\n");
#endif
#ifdef PRINTKS
	  printks(c,total/minval);
#endif
	  break;
	}
      else if(c[i].val==total && c[i].cnt > 0)
	{
	  c[i].cnt--;
	  cc++;
#ifdef DEBUG
	  printf("*\n");
#endif
#ifdef PRINTKS
	  printks2(c);
#endif
	  c[i].cnt++;
	}
      else if(c[i].val<total && c[i].val <= maxval && c[i].cnt > 0 )
	{
	  memcpy(c1,c,7*2*sizeof(int));
	  c1[i].cnt--;
	  search(c1,total-c1[i].val,c[i].val);
	}
    }
 }

main()
{
  int i,nn;
  while(EOF!=scanf("%d ",&m) && m)
    {
      memset(card,0,7*2*sizeof(int));
      for(i=0;i<m;i++)
	{
	  scanf("%d %d",&(card[i].val),&(card[i].cnt));
	  //printf("%d %d\n",(card[i].val),(card[i].cnt));
	}
      qsort(card,m,sizeof(struct card_inf),(__compar_fn_t)comp);
      minval = card[m-1].val;
#ifdef DEBUG
      printf("MINV %d\n",minval);
#endif
      scanf("%d",&g);  //game kaisuu

      for(i=0;i<g;i++)
	{
	  scanf("%d",&nn);
	  cc=0;
	  search(card,nn,INT_MAX);
#ifdef DEBUG
	  printf("\n");
#endif
	  printf("%d\n",cc);
	}

    }
return(0);
}