ZOJ 2734
View Code
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