地址: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 }