HDU - 1114

 

传送门

限制容量恰好为W的完全背包。

那就设dp[j]为容量为j恰好能得到的最小价值,不存在则设为INF

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #define INF 0x3f3f3f3f
 6 #define MOD 1000000007
 7 using namespace std;
 8 typedef long long LL;
 9 
10 const int maxn = 5e2 + 5;
11 const int maxw = 1e4 + 5;
12 int p_w, tot_w, W;
13 int N;
14 int val[maxn], wei[maxn];
15 int dp[maxw];
16 int T;
17 
18 void solve() {
19     memset(dp, INF, sizeof(dp));
20     dp[0] = 0; //
21     for (int i = 0; i < N; i++) {
22         for (int j = wei[i]; j <= W; j++) {
23             dp[j] = min(dp[j], dp[j - wei[i]] + val[i]);
24         }
25     }
26     if (dp[W] == INF) {
27         puts("This is impossible.");
28     } else {
29         printf("The minimum amount of money in the piggy-bank is %d.\n", dp[W]);
30     }
31 }
32 
33 int main(int argc, const char * argv[]) {
34     scanf("%d", &T);
35     while (T--) {
36         scanf("%d%d", &p_w, &tot_w);
37         W = tot_w - p_w;
38         scanf("%d", &N);
39         for (int i = 0; i < N; i++) {
40             scanf("%d%d", &val[i], &wei[i]);
41         }
42         solve();
43     }
44     return 0;
45 }

 

posted @ 2017-08-23 12:37  xFANx  阅读(118)  评论(0编辑  收藏  举报