1 #include<stdio.h>
2 #include<stdlib.h>
3 从第一种开始搜索,搜索完毕后回溯,搜索下一个
4 int n,m,count,sum,val[11],num[11];
5 void DFS(int x)
6 {
7 int i;
8 if(sum == n)
9 {
10 count++;
11 return ;
12 }
13 if(sum > n || x > m)
14 return ;
15 for(i=1; i<=num[x]; i++)
16 {
17 sum += val[x];
18 DFS(x+1);
19 }
20 for(i=1; i<=num[x]; i++) //回溯
21 {
22 sum -= val[x];
23 }
24 DFS(x+1);//搜索下一个
25 }
26
27 int main()
28 {
29 int i,k=0;
30
31 while(scanf("%d%d",&n,&m) != EOF)
32 {
33 for(i=1; i<=m; i++)
34 {
35 scanf("%d%d",&val[i],&num[i]);
36 }
37 count = sum = 0;
38 DFS(1);
39 printf(k++ ? "\n%d\n" : "%d\n",count); //注意题目的输出限制
40 }
41 return 0;
42 }
43