HDU 2639 Bone Collector II (01背包,第k解)
题意:
数据是常规的01背包,但是求的不是最大容量限制下的最佳解,而是第k佳解。
思路:
有两种解法:
1)网上普遍用的O(V*K*N)。
2)先用常规01背包的方法求出背包容量限制下能装的最大价值m,再以m为背包容量再进行一次01背包,dp[j]表示当物品的组合价值为j时,它们的体积之和的最小量。那么就求出了所有可能的价值,从1~m都有,但是其中一些是求不出来的,也就是骨头的价值不能组合成这个数字,那么就得过滤掉。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <limits.h>
using namespace std;
int N, V, K, dp[], w[], v[]; void cal()
{
for(int i=; i<N; i++)
{
for(int j=V; j>=v[i]; j--)
dp[j] = max( dp[j], dp[j-v[i]]+w[i] );
}
if(K==)
{
cout<<dp[V]<<endl;
return ;
} int m=dp[V];
int flag=(<<)+(<<);
dp[]=;
for(int i=; i<=m; i++)
dp[i]=flag; for(int i=; i<N; i++)
{
for(int j=m; j>=w[i]; j--)
{
if(dp[j-w[i]]<flag)
dp[j]=min(dp[j], dp[j-w[i]]+v[i]); }
} int cnt=;
for(int i=m; i>; i--)
{
if(dp[i]!=flag && dp[i]<=V )
{
cnt++;
if(cnt==K)
{
cout<<i<<endl;
return ;
}
}
}
cout<<""<<endl;
} int main()
{
//freopen("input.txt","r",stdin);
int t;
cin>>t;
while(t--)
{
memset(dp,,sizeof(dp));
cin>>N>>V>>K;
for(int i=; i<N; i++)
cin>>w[i];
for(int i=; i<N; i++)
cin>>v[i];
cal(); }
return ;
}
AC代码(第2种解法)
HDU 2639 Bone Collector II (01背包,第k解)的更多相关文章
- HDU - 2639 Bone Collector II (01背包第k大解)
分析 \(dp[i][j][k]\)为枚举到前i个物品,容量为j的第k大解.则每一次状态转移都要对所有解进行排序选取前第k大的解.用两个数组\(vz1[],vz2[]\)分别记录所有的选择情况,并选择 ...
- 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背包变型)
此题就是在01背包问题的基础上求所能获得的第K大的价值. 详细做法是加一维去推当前背包容量第0到K个价值,而这些价值则是由dp[j-w[ i ] ][0到k]和dp[ j ][0到k]得到的,事实上就 ...
- hdu–2369 Bone Collector II(01背包变形题)
题意:求解01背包价值的第K优解. 分析: 基本思想是将每个状态都表示成有序队列,将状态转移方程中的max/min转化成有序队列的合并. 首先看01背包求最优解的状态转移方程:\[dp\left[ j ...
- HDOJ(HDU).2602 Bone Collector (DP 01背包)
HDOJ(HDU).2602 Bone Collector (DP 01背包) 题意分析 01背包的裸题 #include <iostream> #include <cstdio&g ...
- 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 2639 Bone Collector II
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU2639Bone Collector II[01背包第k优值]
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
随机推荐
- linux ip地址自动获取,ip地址…
linux ip地址自动获取,ip地址手动设置(图文解释) 2011-04-19 16:19:31| 分类: 服务器(appache/n | 标签: |字号大中小 订阅 linux ip地址自动获取( ...
- (十四)hibernate逆向工程
一.hibernate逆向工程生成实体 介绍一个模型设计工具PowerDesigner,这个是j2ee开发必要的一个工具.一般在开发中先使用PowerDesigner 创建实体关系图即概念模型.建立了 ...
- Insert into a Binary Search Tree
Given the root node of a binary search tree (BST) and a value to be inserted into the tree, insert t ...
- U3D Shader基础
http://blog.sina.com.cn/s/blog_471132920101dcnr.html 转载自风宇冲Unity3D教程学院 一个SubShader(渲染方案)是由一个个Pass块来执 ...
- python 模拟事件触发机制
EventManager.py # -*- encoding: UTF-8 -*- # 系统模块 from queue import Queue, Empty from threading impor ...
- solidity 学习笔记(7)内联汇编
为什么要有内联汇编? //普通循环和内敛汇编循环比较 pragma solidity ^0.4.25; contract Assembly{ function nativeLoop() public ...
- -cogs1247. [Nescafé29] 穿越七色虹
1247. [Nescafé29] 穿越七色虹 ★ 输入文件:rainbow.in 输出文件:rainbow.out 简单对比时间限制:5 s 内存限制:128 MB [背景] 在Ne ...
- maven分层架构搭建
1.准备工作: 1.创建数据源 CREATE TABLE `users` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFA ...
- iOS 技术支持
iOS 技术支持网址:有问题或建议请留言. 邮箱地址:odeyrossskudder4266848@mail.com iOS program design & system consultat ...
- PostgreSQL - raise函数打印字符串
raise函数 在PostgreSQL中,该函数用于打印字符串,类似于Java中的System.out.println(),Oracle中的dbms_output.put_line(). 用法如下: ...