[HDOJ2639]Bone Collector II(第k优01背包)

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

题意:求01背包的第k优解

dp(i, j)表示容量为j时的i优解

对于第二维的操作和01背包几乎一样,只是我们只需要关注每一次取的前k大个即可。

 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 const int maxn = 1010;
23 int n, m, k;
24 int v[maxn], w[maxn];
25 int dp[maxn][maxn];
26 int d[maxn];
27 
28 int main() {
29     freopen("in", "r", stdin);
30     int T;
31     scanf("%d", &T);
32     while(T--) {
33         scanf("%d%d%d", &n, &m, &k);
34         for(int i = 0; i < n; i++) {
35             scanf("%d", &v[i]);
36         }
37         for(int i = 0; i < n; i++) {
38             scanf("%d", &w[i]);
39         }
40         memset(dp, 0, sizeof(dp));
41         for(int i = 0; i < n; i++) {
42             for(int j = m; j >= w[i]; j--) {
43                 int cnt = 0;
44                 for(int p = 1; p <= k; p++) {
45                     d[cnt++] = dp[p][j];
46                     if(j - w[i] >= 0) {
47                         d[cnt++] = dp[p][j-w[i]] + v[i];
48                     }
49                 }
50                 sort(d, d+cnt, greater<int>());
51                 cnt = unique(d, d+cnt) - d;
52                 int q = 1;
53                 for(int p = 0; p < cnt; p++) {
54                     dp[q++][j] = d[p];
55                 }
56             }
57         }
58         printf("%d\n", dp[k][m]);
59     }
60     return 0;
61 }

 

posted @ 2016-04-27 19:20  Kirai  阅读(167)  评论(0编辑  收藏  举报