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\n",dp[v][K]);
    }
    return 0;
}






本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5279278.html,如需转载请自行联系原作者
相关文章
|
监控 安全 物联网
什么是UWB定位技术?UWB定位的应用场景及功能介绍
uwb定位技术全称Ultra Wide Band,超宽带技术。uwb超宽带技术是一种全新的通信技术,与传统通信技术有极大差异。它不需要使用传统通信体制中的载波,而是通过发送和接收极窄脉冲来实现无线传输,由于脉冲时间宽度极窄,使用的带宽在500MHz以上。 后来,由于uwb定位技术穿透力强、功耗低、安全性高、定位精度高等优势,人们意识到了它在高精度定位领域的价值,uwb在工业定位领域的应用逐渐成为主流。
2709 0
|
easyexcel Java
EasyExcel模板填充
EasyExcel模板填充
743 1
|
12月前
|
运维 监控 网络协议
OSPF的网络设计原则
OSPF的网络设计原则
263 3
|
人工智能 程序员 测试技术
AI程序员Devin在软件开发中的性能评估
【2月更文挑战第29天】AI程序员Devin在软件开发中取得突破,成功解决SWE-bench基准测试13.86%的问题,超出未辅助基线1.96%。展示强大编程能力,但处理复杂任务成功率仅4.80%,表明局限性。Devin能执行多步计划和自我纠错,但在理解复杂逻辑和用户偏好上需改进。在测试驱动开发场景下,成功通过率提升至23%,显示出合作潜力。然而,AI在软件工程领域仍有很大改进空间。
368 1
AI程序员Devin在软件开发中的性能评估
ly~
|
传感器 存储 供应链
大数据在供应链管理中的具体应用案例
以下是大数据在供应链管理中的具体应用案例:沃尔玛通过整合内外部数据进行需求预测,提前调配应急物资;亚马逊利用大数据优化库存管理,提高周转率并降低成本;DHL通过传感器收集数据优化物流路线,提升运输效率。大数据的优势在于提高需求预测准确性、优化库存管理、提升物流效率、增强供应商管理和提高供应链可视性,从而实现全方位的供应链优化。
ly~
3104 2
|
前端开发
Bootstrap 5 保姆级教程(二):文字排版 & 颜色
Bootstrap 5 保姆级教程(二):文字排版 & 颜色
|
Linux 数据安全/隐私保护
ntp协议为什么不能主动同步超两年的时钟差异?是由哪些配置决定的
ntp协议为什么不能主动同步超两年的时钟差异?是由哪些配置决定的
576 3
|
编解码 运维 Cloud Native
|
程序员 开发工具 开发者
程序员都该知道的 Github PR 流程
程序员都该知道的 Github PR 流程
579 0
|
SQL Java 关系型数据库
在IDEA中配置MySQL数据库连接以及在使用mybatis时设置sql语句的代码提示功能
在IDEA中配置MySQL数据库连接以及在使用mybatis时设置sql语句的代码提示功能