题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639

题意:给出一行价值,一行体积,让你在v体积的范围内找出第k大的值

分析:dp[i][j][k]表示前i个物品容积为j时的第k优解。那么对于每种状态dp[i][j]都需要维护好前k优解。

每次根据前k优解进行每种取或不取第i件物品,用数组a记录取第i件物品,数组b记录不取,这样

数组a,b了所有能组成j的x种解,最后在x里取前k优解记录下来就好。剩下的肯定不是前k优解了。。。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 1000000007
#define inf 0x3f3f3f3f
#define N 10010
using namespace std;
int p[],w[],dp[][],a[],b[];
int main()
{
int t,n,v,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&v,&k);
memset(dp,,sizeof(dp));
for(int i=; i<=n; i++)scanf("%d",&p[i]);
for(int i=; i<=n; i++)scanf("%d",&w[i]);
for(int i=; i<=n; i++)
{
for(int j=v; j>=w[i]; j--)
{
for(int l=; l<=k; l++)//组成体积为j无非就是j-w[i]状态加上第i件和不取第i件,最多有2k种
{
a[l]=dp[j-w[i]][l]+p[i];
b[l]=dp[j][l];
}
a[k+]=-;
b[k+]=-;
int x,y,z;
x=y=z=;
while(z<=k&&(a[x]!=-||b[y]!=-))//在最多2k种里取最大的k个解并有序存入
{
if(a[x]>b[y])
{
dp[j][z]=a[x];
x++;
}
else
{
dp[j][z]=b[y];
y++;
}
if(dp[j][z]!=dp[j][z-])z++;
}
}
}
printf("%d\n",dp[v][k]);
}
}

hdu2639(背包求第k优解)的更多相关文章

  1. Bone Collector II---hdu2639(01背包求第k优解)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639求01背包的第k大解.合并两个有序序列 选取物品i,或不选.最终的结果,是我们能在O(1)的时间内 ...

  2. 关于01背包求第k优解

    引用:http://szy961124.blog.163.com/blog/static/132346674201092775320970/ 求次优解.第K优解 对于求次优解.第K优解类的问题,如果相 ...

  3. 01背包之求第K优解——Bone Collector II

    http://acm.hdu.edu.cn/showproblem.php?pid=2639 题目大意是,往背包里赛骨头,求第K优解,在普通01背包的基础上,增加一维空间,那么F[i,v,k]可以理解 ...

  4. 背包的第k优解[动态规划]

    From easthong ☆背包的第k优解                 描述 Description     DD 和好朋友们要去爬山啦!他们一共有 K 个人,每个人都会背一个包.这些包的容量是 ...

  5. hdu 2639 Bone Collector II (01背包,求第k优解)

    这题和典型的01背包求最优解不同,是要求第k优解,所以,最直观的想法就是在01背包的基础上再增加一维表示第k大时的价值.具体思路见下面的参考链接,说的很详细 参考连接:http://laiba2004 ...

  6. 01背包(第k优解)

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

  7. (01背包 第k优解) Bone Collector II(hdu 2639)

    http://acm.hdu.edu.cn/showproblem.php?pid=2639       Problem Description The title of this problem i ...

  8. dp之01背包hdu2639(第k优解)

    http://acm.hdu.edu.cn/showproblem.php?pid=2639 题意:给出一行价值,一行体积,让你在v体积的范围内找出第k大的值.......(注意,不要 和它的第一题混 ...

  9. 背包【p1858】 多人背包(次优解 or 第k优解)

    题目描述--->p1858 多人背包 分析: 很明显,这题是背包问题的一种变形. 求解 次优解or第k优解. 表示刚开始有点懵,看题解也看不太懂. 又中途去补看了一下背包九讲 然后感觉有些理解, ...

随机推荐

  1. c语言,gdb

    Get gdb call stack http://blog.csdn.net/zoufeiyy/article/details/1490241 Debugging with GDB - Examin ...

  2. 讲解下for循环的用法,加深记忆

    引子 这是一段很简单的代码,但是即便是这么简单的东西,这里我们还是需要说一下. 关于for循环整个执行流程就是,先执行var i=10,然后到了第二个语句,判断10是否大于0,很明显为true,所以此 ...

  3. Qt QDebug等重定向到文件中

    源地址:http://blog.163.com/soyo_gogogo/blog/static/171414077201392705639321/ Qt的qDebug() 等函数,可以打印出十分细致的 ...

  4. jQuery EasyUI API 中文文档 - 分隔按钮(splitbutton)

    <html> <head> <script src="jquery-easyui/jquery.min.js"></script> ...

  5. SVM(支持向量机)(二)—Lagrange Duality(拉格朗日对偶问题)

    (整理自AndrewNG的课件,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) SVM有点让人头疼,但还是要弄明白.把这一大块搞懂了,会很有成就感 ...

  6. android在其他线程中访问UI线程的方法

    1.Activity.runOnUiThread( Runnable ) 2.View.post( Runnable ) 3.View.postDelayed( Runnable, long ) 4. ...

  7. Ubuntu 安装和配置minicom

    Ubuntu 安装和配置minicom 1 . 安装 Minicom 用新立得软件管理器下载minicom 2.配置Minicom shell下输入 minicom -s 打开配置界面 进入Seria ...

  8. php可获取客户端信息

    <?php echo "<br>".$_SERVER['PHP_SELF'];#当前正在执行脚本的文件名,与 document root相关 echo " ...

  9. UI编辑器

    本篇教程通过制作捕鱼达人的启动界面来说明CocoStudio UI编辑器的用法.先看看效果图 好了,下面一步一步的动手做吧! 1.打开软件 2.新建项目 依次打开软件主界面左上角菜单栏的:“文件”-- ...

  10. 让动态创建的ActiveX控件响应Windows消息

    当我们通过 CWnd::CreateControl() 动态创建 ActiveX   控件时, Windows 消息并不会被发送给我 们的由   CWnd 派生得控件类.例如,即使我们为 WM_KIL ...