zoukankan      html  css  js  c++  java
  • [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
    ", dp[k][m]);
    59     }
    60     return 0;
    61 }
  • 相关阅读:
    HDU 1525
    kmp模板
    hdu 4616 Game(树形DP)
    hdu 4619 Warm up 2(并查集活用)
    hdu 4614 Vases and Flowers(线段树加二分查找)
    Codeforces 400D Dima and Bacteria(并查集最短路)
    poj 2823 Sliding Window (单调队列)
    hdu 2196 Computer(树形dp)
    hdu 4604 Deque
    最短路径
  • 原文地址:https://www.cnblogs.com/kirai/p/5440075.html
Copyright © 2011-2022 走看看