题意:

01背包,找出第k最优解

题解:

对于01背包最优解我们肯定都很熟悉

第k最优解的话也就是在dp方程上加一个维度来存它的第k最优解(dp[i][j]代表,体积为i能获得的第j最大价值)

对于每一个物品只有两种选择情况

1、把这个物品加入背包

2、不要这个物品

那么它的前k种最优解也是由n种物品的这两个选择组成的

假设总体积是4,现在有两种物品,求第2最大值

1、体积1,价值3

2、体积1,价值2

最开始dp状态:

体积:    1  2  3  4

第1最大值:0  0  0  0

第2最大值:0  0  0  0

x、y数组是用来记录他从上一个状态转移过来的前k最大值。

x数组代表需要这个物品的时候的前k最大值

y数组代表不需要这个物品的时候前k最大值

下面演示过程:

体积为4的时候

x[1]=v[4-1][1]+3 =3

x[2]=v[4-1][2]+3 =3

y[1]=v[4][1]=0

y[2]=v[4][2]=0

下面那个while循环的意思就是给x数组和y数组这4个数(因为我要求第2(k)最大值,所以是2*2(2*k)个数)从大到小排序之后去重,从中挑出来2(k)个赋值给v[j][1],v[j][2](v[j][1]...v[j][k])

排序后:3 3 0 0,去重后3 0

那么v[4][1]=3,v[4][2]=0

可能有些人不明白while代码中怎么会有去重操作,我们来看一下

给v[4][1]赋值的时候因为x[1]=3>y[1]=0,所以很自然v[4][1]=3

这个时候给v[4][2]赋值,因为x[2]=3>y[1]=0,所以v[4][2]=3。但是因为v[4][1]==v[4][2]所以循环不会结束

我们来看一下循环结束条件while((m<=f || n<=f) && o<=f)

之有前k个最优值都找到之后循环会结束,或者x和y数组所有值都用完了

所以还是去给v[4][2]赋值,那么又因为x[3]=y[3]=-1。所以x[3]=-1<y[0]=0,那么v[4][2]=0

这个时候循环就结束了

我上面解释的时候用的是前k最大值,代码中用的字母是f。。。

代码:

 1 #include<stdio.h>
2 #include<string.h>
3 int q[105],w[105],v[1005][35],x[1005],y[1005];
4 int main()
5 {
6 int a,s,sum,d,f,g;
7 scanf("%d",&a);
8 while(a--)
9 {
10 memset(v,0,sizeof(v));
11 scanf("%d%d%d",&s,&d,&f);
12 for(int i=1; i<=s; ++i)
13 {
14 scanf("%d",&w[i]);
15 sum+=w[i];
16 }
17 for(int i=1; i<=s; ++i)
18 scanf("%d",&q[i]);
19 for(int i=1; i<=s; ++i)
20 {
21 for(int j=d; j>=q[i]; --j)
22 {
23 int k;
24 for(k=1; k<=f; ++k)
25 {
26 x[k]=v[j-q[i]][k]+w[i];
27 y[k]=v[j][k];
28 }
29 x[k]=y[k]=-1;
30 int m,n,o;
31 m=n=o=1;
32 while((m<=f || n<=f) && o<=f)
33 {
34 if(x[m]>y[n])
35 {
36 v[j][o]=x[m];
37 ++m;
38 }
39 else
40 {
41 v[j][o]=y[n];
42 ++n;
43 }
44 if(v[j][o]!=v[j][o-1]) ++o;
45 }
46 }
47 }
48 printf("%d\n",v[d][f]);
49 }
50 return 0;
51 }

Bone Collector II HDU - 2639 01背包第k最大值的更多相关文章

  1. HDU 2639(01背包第K大)

    http://acm.hdu.edu.cn/showproblem.php?pid=2639 http://blog.csdn.net/lulipeng_cpp/article/details/758 ...

  2. HDU 2639 01背包(分解)

    http://acm.hdu.edu.cn/showproblem.php?pid=2639 01背包第k优解,把每次的max分步列出来即可 #include<stdio.h> #incl ...

  3. HDU 2639 01背包求第k大

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. HDU 2602 Bone Collector骨头收藏者(01背包)

    题意:收藏骨头. 思路: 常规的01背包. #include <iostream> #define N 1005 using namespace std; int volume[N]; / ...

  5. hdoj2602 Bone Collector(DP,01背包)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2602 题意 有n块骨头,每块骨头体积为volume,价值为value,还有一个容量为v的背包,现在将骨 ...

  6. HDU 2639 Bone Collector II(01背包变形【第K大最优解】)

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  7. hdu 2639 Bone Collector II(01背包 第K大价值)

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. HDU 2639 Bone Collector II【01背包 + 第K大价值】

    The title of this problem is familiar,isn't it?yeah,if you had took part in the "Rookie Cup&quo ...

  9. HDU 3639 Bone Collector II(01背包第K优解)

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

随机推荐

  1. 使用Jenkins+Pipline 持构建自动化部署之安卓源码打包、测试、邮件通知

    一.引言 Jenkins 2.x的精髓是Pipeline as Code,那为什么要用Pipeline呢?jenkins1.0也能实现自动化构建,但Pipeline能够将以前project中的配置信息 ...

  2. Java并发包源码学习系列:详解Condition条件队列、signal和await

    目录 Condition接口 AQS条件变量的支持之ConditionObject内部类 回顾AQS中的Node void await() 添加到条件队列 Node addConditionWaite ...

  3. python常见题型

    语言特性 1. 谈谈对 Python 和其他语言的区别 2. 简述解释型和编译型编程语言 3. Python 的解释器种类以及相关特点? 4. Python3 和 Python2 的区别? 5. Py ...

  4. Nginx 路由转发和反向代理 location 配置

    Nginx 配置的三种方式 第一种直接替换 location 匹配部分 第二种 proxy_pass 的目标地址,默认不带 /,表示只代理域名,url 和参数部分不会变(把请求的 path 拼接到 p ...

  5. 【Linux】Linux基础命令 - 目录相关的命令 ls 、cd、du

    文章目录 目录相关的命令 ls 命令:列出文件和目录 cd 命令:切换目录 du 命令:显示目录包含的文件大小 总结 参考资料 巩固和复习Linux系统基础命令知识 目录相关的命令 ls 命令:列出文 ...

  6. MyBatis初级实战之三:springboot集成druid

    OpenWrite版: 欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kuber ...

  7. linux命名小技巧(持续更新)

    一   向某个文件批量加入内容 1.1 向/etc/wxm文件添加一大段内容可以使用这个命令 [root@registry easyrsa3]# cat <<EOF >varsset ...

  8. Azure Terraform(六)Common Module

    一,引言 之前我们在使用 Terraform 构筑一下 Azure 云资源的时候,直接将所以需要创建的资源全面写在 main.tf 这个文件中,这样写主要是为了演示使用,但是在实际的 Terrafor ...

  9. 前端面试准备笔记之JavaScript(02)

    01. this的典型应用场景 this在各个场景中取什么值,是在函数执行的时候确认的,不是在定义的时候确认的. 普通函数执行 返回window function fn1() { console.lo ...

  10. Spark调优,性能优化

    Spark调优,性能优化 1.使用reduceByKey/aggregateByKey替代groupByKey 2.使用mapPartitions替代普通map 3.使用foreachPartitio ...