zoukankan      html  css  js  c++  java
  • HDU2639Bone Collector II(01背包变形)

    01背包,求第k大。

    以前看k短路的时候看过代码以为懂了 = =结果还是跑去看了别人的代码才会。果然要自己写一遍才行啊 0.0难得1A。。

    每次把可能的2k种求出来,求前k个。注意要不一样的k个数。。

    /**************************************************************
    Problem : 2639 ( Bone Collector II )     Judge Status : Accepted
    RunId : 15212165    Language : G++    Author : G_lory
    Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
    ***************************************************************/
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    //N <= 100 , V <= 1000 , K <= 30
    
    const int MAXN = 105;
    const int MAXV = 1005;
    const int MAXK = 35;
    
    int val[MAXN];
    int vol[MAXN];
    
    int dp[MAXV][MAXK];
    
    int a[MAXK], b[MAXK];
    
    int main()
    {
        int n, v, k;
        int t;
        cin >> t;
        while (t--)
        {
            memset(dp, 0, sizeof dp);
    
            cin >> n >> v >> k;
            for (int i = 0; i < n; ++i)
                cin >> val[i];
            for (int i = 0; i < n; ++i)
                cin >> vol[i];
    
            for (int i = 0; i < n; ++i)
            {
                for (int j = v; j >= vol[i]; --j)
                {
                    for (int q = 0; q < k; ++q)
                    {
                        a[q] = dp[j][q];
                        b[q] = dp[j - vol[i]][q] + val[i];
                    }
    
                    int ic = 0, jc = 0;
                    int ck = 0;
    
                    while (ic < k && jc < k && ck < k)
                    {
                        if (a[ic] < b[jc])
                        {
                            if (ck == 0 || b[jc] < dp[j][ck - 1])
                                dp[j][ck++] = b[jc];
                            jc++;
                        }
                        else
                        {
                            if (ck == 0 || a[ic] < dp[j][ck - 1])
                                dp[j][ck++] = a[ic];
                            ic++;
                        }
                    }
    
                    while (ic < k && ck < k)
                    {
                        if (ck == 0 || a[ic] < dp[j][ck - 1])
                            dp[j][ck++] = a[ic];
                        ic++;
                    }
    
                    while (jc < k && ck < k)
                    {
                        if (ck == 0 || b[jc] < dp[j][ck - 1])
                            dp[j][ck++] = b[jc];
                        jc++;
                    }
                }
            }
    
            cout << dp[v][k - 1] << endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    vs调试技巧
    ubuntu中安装Docker
    Docker的简单认知
    mysql笔记01
    5款实用的硬盘、SSD固态硬盘、U盘、储存卡磁盘性能测试工具绿色版
    怎么用HD Tune检测硬盘坏道
    Dreamweaver_CS6安装与破解
    Microsoft Office 2013 (64位) 免费完整版(安装 + 激活)
    Microsoft office2007免费版下载(安装 + 破解)
    OneNote如何使用
  • 原文地址:https://www.cnblogs.com/wenruo/p/4904142.html
Copyright © 2011-2022 走看看