地址:http://acm.hdu.edu.cn/showproblem.php?pid=2110

题意:中文。

mark:母函数。但是判有无解的时候要注意,假如答案是10000种,对10000取模后就是0,此时不能判断为无解。可以加一个数组solution表示是否有解。

代码:

 1 # include <stdio.h>
 2 # include <string.h>
 3 
 4 
 5 int n, sum, MOD = 10000 ;
 6 int p[110], m[110], dp[10010], sol[10010] ;
 7 
 8 
 9 int work()
10 {
11     int i, j, k ;
12     if (sum%3 != 0) return -1 ;
13     memset (dp, 0, sizeof(dp)) ;
14     memset (sol, 0, sizeof(sol)) ;
15     dp[0] = sol[0] = 1 ;
16     for (i = 0 ; i < n ; i++)
17         for (j = sum/3 ; j >= 0 ; j--)
18             for (k = 1 ;k <= m[i] && j >= k*p[i] ; k++)
19                 dp[j] = (dp[j] + dp[j-k*p[i]]) % MOD,
20                 sol[j] = (sol[j] | sol[j-k*p[i]]) ;
21     if (!sol[sum/3]) return -1 ;
22     return dp[sum/3] ;
23 }
24 
25 
26 int main ()
27 {
28     int i, ans ;
29     while (~scanf ("%d", &n) && n)
30     {
31         sum = 0 ;
32         for (i = 0 ; i < n ; i++)
33             scanf ("%d%d", &p[i], &m[i]),
34             sum += p[i]*m[i] ;
35         ans = work() ;
36         if (ans < 0) puts ("sorry") ;
37         else printf ("%d\n", ans) ;
38     }
39     return 0 ;
40 }