[HDOJ2546] 饭卡 (01背包)

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

先找出最贵的那个菜,这个菜一定是最后买的那个。然后再在前n-1个菜里做01背包。找出不超过m-5的最大价值。然后用m减去这两个值即可。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <iomanip>
 4 #include <cstring>
 5 #include <climits>
 6 #include <complex>
 7 #include <fstream>
 8 #include <cassert>
 9 #include <cstdio>
10 #include <bitset>
11 #include <vector>
12 #include <deque>
13 #include <queue>
14 #include <stack>
15 #include <ctime>
16 #include <set>
17 #include <map>
18 #include <cmath>
19 
20 using namespace std;
21 
22 //kirai
23 const int maxn = 1111;
24 int n, m;
25 int dp[maxn];
26 int w[maxn];
27 
28 int main() {
29     // freopen("in", "r", stdin);
30     while(~scanf("%d", &n) && n) {
31         int maxx = -1;
32         int pos;
33         for(int i = 1; i <= n; i++) {
34             scanf("%d", &w[i]);
35             if(maxx < w[i]) {
36                 maxx = w[i];
37                 pos = i;
38             }
39         }
40         swap(w[pos], w[n]);
41         scanf("%d", &m);
42         if(m < 5) {
43             printf("%d
", m);
44             continue;
45         }
46         memset(dp, 0, sizeof(dp));
47         for(int i = 1; i < n; i++) {
48             for(int j = m - 5; j >= w[i]; j--) {
49                 dp[j] = max(dp[j], dp[j-w[i]]+w[i]);
50             }
51         }
52         printf("%d
", m - maxx - dp[m-5]);
53     }
54     return 0;
55 }
原文地址:https://www.cnblogs.com/kirai/p/5400386.html