Bone Collector II HDU - 2639 01背包第k最大值
题意:
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最大值的更多相关文章
- HDU 2639(01背包第K大)
http://acm.hdu.edu.cn/showproblem.php?pid=2639 http://blog.csdn.net/lulipeng_cpp/article/details/758 ...
- HDU 2639 01背包(分解)
http://acm.hdu.edu.cn/showproblem.php?pid=2639 01背包第k优解,把每次的max分步列出来即可 #include<stdio.h> #incl ...
- HDU 2639 01背包求第k大
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU 2602 Bone Collector骨头收藏者(01背包)
题意:收藏骨头. 思路: 常规的01背包. #include <iostream> #define N 1005 using namespace std; int volume[N]; / ...
- hdoj2602 Bone Collector(DP,01背包)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2602 题意 有n块骨头,每块骨头体积为volume,价值为value,还有一个容量为v的背包,现在将骨 ...
- HDU 2639 Bone Collector II(01背包变形【第K大最优解】)
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- hdu 2639 Bone Collector II(01背包 第K大价值)
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 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 ...
- HDU 3639 Bone Collector II(01背包第K优解)
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
随机推荐
- git 遇到 fatal: loose object xxxx (stored in .git/objects/cb/xxxx) is corrupt 问题
我的git版本是2.3.x,用下面这个参考链接的方法也可以解决 参考blog
- 【Problem】前端项目运行:Module build failed:Error Node Sass does not yet support my current environmen
我在运行renren-fast-vue前端项目时,安装完依赖cnpm install 启动服务npm run dev 出现问题. Module build failed: Error: Node Sa ...
- kubernets与API服务器进行交互
一 为何需要与kubernets集群的API服务器进行交互 1.1 kubernets提供了一种downapi的资源可以将pod的元数据渲染成环境变量或者downward卷的形式挂载到容器的文件系 ...
- buuctf刷题之旅—web—随便注
打开环境 根据提示应该是sql注入 查看数据库名,和数据表 1';show databases;# 1';show tables;# 查看表内字段(1';desc `1919810931114514` ...
- const关键字:终于拥有真正的常量声明语句
本文首发于个人网站:const关键字:终于拥有真正的常量声明语句 你好,今天大叔想和你唠扯唠扯 ES6 新增的关键字 -- const.在说 const 关键字之前,大叔先和你唠唠大叔自己对 cons ...
- 1V转5V芯片,三个元件即可组成完整的稳压方案
1V低电压要转成5V的电压,需要1V转5V的芯片,由于1V输入,所以不需要指望能输出多大的电流,压差和1V的供电电压意味着供电电流也是无法做大的了.一般1V转5V的输出电流在0MA-100mA,一般6 ...
- UNIX DOMAIN SOCKETS IN GO unix域套接字
Unix domain sockets in Go - Golang News https://golangnews.org/2019/02/unix-domain-sockets-in-go/ pa ...
- __new__() to create it, and __init__() to customize it 类方法 实例方法
https://docs.python.org/3/reference/datamodel.html#object.__init__
- You shouldn't use *any* general-purpose hash function for user passwords, not BLAKE2, and not MD5, SHA-1, SHA-256, or SHA-3
hashlib - Secure hashes and message digests - Python 3.8.3 documentation https://docs.python.org/3.8 ...
- Hive语法小释
阅读本文你可以获取: 1.数据库的查询 2.hive表的基本操作(建表三种常用方式.删除表.修改表.加载数据.内外表转换.添加分区.复制数据) 3.SQL到HiveQL的的一些不同点 1. 基本操 ...