地址:http://acm.hdu.edu.cn/showproblem.php?pid=1114
题意:小盆友通过往猪猪存钱罐里放钱的方式攒钱做事。存钱罐除非砸坏,否则无法把钱取出。为了知道是否攒了足够的钱,对存钱罐称重。然后告诉每种钱币的重量和价值,问存钱罐里最少可能有多少钱。
mark:算是一个比较裸的完全背包问题。只不过是选最小。
代码:
1 # include <stdio.h> 2 # include <string.h> 3 4 5 int n, m, INF = 0x3f3f3f3f ; 6 int p[510], w[510] ; 7 int dp[10010] ; 8 9 10 int min(int a, int b){return a<b?a:b;} 11 12 13 void work() 14 { 15 int i, j ; 16 memset (dp, 0x3f, sizeof(dp)) ; 17 dp[0] = 0 ; 18 for (i = 0 ; i < n ; i++) 19 for (j = w[i] ; j <= m ; j++) 20 dp[j] = min(dp[j], dp[j-w[i]]+p[i]) ; 21 if (dp[m] == INF) puts ("This is impossible.") ; 22 else printf ("The minimum amount of money in the piggy-bank is %d.\n", dp[m]) ; 23 } 24 25 26 int main () 27 { 28 int T, e, f, i ; 29 scanf ("%d", &T) ; 30 while (T--) 31 { 32 scanf ("%d%d", &e, &f) ; 33 m = f-e ; 34 scanf ("%d", &n) ; 35 for (i = 0 ; i < n ; i++) 36 scanf ("%d%d", &p[i], &w[i]) ; 37 work() ; 38 } 39 return 0 ; 40 }