zoukankan      html  css  js  c++  java
  • HDU 2639 Bone Collector II(01背包变型)

    此题就是在01背包问题的基础上求所能获得的第K大的价值。

    详细做法是加一维去推当前背包容量第0到K个价值,而这些价值则是由dp[j-w[ i ] ][0到k]和dp[ j ][0到k]得到的,事实上就是2个数组合并之后排序,可是实际做法最好不要怎么做。由于你不知道总共同拥有多少种。而我们最多仅仅须要前K个大的即可了(由于可能2个数组加起来的组合数达不到K个),假设所有加起来数组开多大不清楚,所以能够选用归并排序中把左右2个有序数组合并成一个有序数组的方法来做。就是用2个变量去标记2个有序数组的头。然后比較。选了这个就这个变量加加,唯一不同的是不能有反复的,那么能够用一个非常巧妙的办法,就是在循环结束前推断要加进去的数是否跟前一个一样,假设不一样才加加。

    AC代码:

    #include<cstdio>
    #include<ctype.h>
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<vector>
    #include<stack>
    #include<cmath>
    #include<queue>
    #include<set>
    #include<ctime>
    using namespace std;
    #define push_back pb
    int w[105],vol[105],vis[1005];
    int dp[1005][35];
    int main()
    {
    //    freopen("input.txt","r",stdin);
    //    freopen("o1.txt","w",stdout);
    
        int i,j,k,t,n,v,K;
        scanf("%d",&t);
        while(t--)
        {
            memset(dp,0,sizeof(dp));
            scanf("%d%d%d",&n,&v,&K);
            for(i = 0; i < n; i++) scanf("%d",&w[i]);
            for(i = 0; i < n; i++)
                scanf("%d",&vol[i]);
            for(i = 0; i <= v; i++) vis[i] = 1;
            int temp[40];
            for(i = 0; i < n; i++)
            {
                for(j = v; j >= vol[i]; j--)
                {
                    memset(temp,0,sizeof(temp));
                    int a = 1,b = 1;
                    k = 1;
                    while((a<=vis[j-vol[i]] || b<=vis[j]) && k <= K)
                    {
                        if((dp[j-vol[i]][a]+w[i] > dp[j][b] && a <= vis[j-vol[i]]) || b > vis[j])
                        {
                            temp[k] = dp[j-vol[i]][a]+w[i];
                            a++;
                        }
                        else
                        {
                            temp[k] = dp[j][b];
                            b++;
                        }
                        if(temp[k] != temp[k-1]) k++;
                    }
                    vis[j] = k;
                    for(k = 1; k <= vis[j]; k++) dp[j][k] = temp[k];
                }
            }
            printf("%d
    ",dp[v][K]);
        }
        return 0;
    }
    


  • 相关阅读:
    解决pyinstaller 打包后运行exe程序出现的"ModuleNotFindError"
    【Tensorflow专题-03】深层神经网络
    【Tensorflow专题-02】使用tensorflow训练神经网络
    【Tensorflow专题-01】深度学习应用介绍及tensorflow基本使用
    Github 简明教程
    Composer 安装与使用
    为jQuery的$.ajax设置超时时间
    thinkphp 数据库表多字段排序
    TP5如何隐藏入口文件index.php
    Atom编辑器快捷键大全
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5279278.html
Copyright © 2011-2022 走看看