杭电1114 完全背包

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114

题目大意:有一个存钱罐,给出它的重量和装满硬币的重量,然后给出里面装的硬币的种类数,并给出每种硬币的面值和重量,求在给定重量的条件下硬币的最小价值。 
解题思路:完全背包。根据《背包九讲》,这道题目相当于要求必须装满给出的重量,因此要使dp[0]=0,同时因为求的是最小值,因此其他位置应该是正无穷。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cstdlib>
 6 #include <cmath>
 7 #include <set>
 8 #include <map>
 9 #include <vector>
10 #define INF 0x3f3f3f3f
11 using namespace std;
12 
13 int dp[10010], w[510], v[510];
14 int min(int a, int b)
15 {
16     return a < b ? a : b;
17 }
18 int main()
19 {
20     int t, e, f, W, i, j, n;
21     scanf("%d", &t);
22     while(t--)
23     {
24         scanf("%d%d", &e, &f);
25         W = f - e;
26         scanf("%d", &n);
27         for(i = 1; i <= n; i++)
28             scanf("%d %d", v + i, w + i);
29         for(i = 1; i <= W; i++)
30             dp[i] = INF;
31         dp[0] = 0;
32         for(i = 1; i <= n; i++)
33         {
34             for(j = w[i]; j <= W; j++)
35             {
36                 dp[j] = min(dp[j], dp[j - w[i]] + v[i]);
37             }
38         }
39         if(dp[W] == INF)
40             printf("This is impossible.\n");
41         else
42             printf("The minimum amount of money in the piggy-bank is %d.\n", dp[W]);
43     }
44     return 0;
45 }

 

posted @ 2016-05-05 20:19  海无泪  阅读(201)  评论(0编辑  收藏  举报