题目链接: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. "); 41 else 42 printf("The minimum amount of money in the piggy-bank is %d. ", dp[W]); 43 } 44 return 0; 45 }