HDU 2639 Bone Collector II(01背包 求第k大)
2015-07-18 23:46
232 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639
题意:
T组数据
n个骨头,背包容量v,k(输出第k大)
每个骨头的价值
每个骨头的体积
输出最终价值第k大的的价值,如果所有的价值种数小于k,就输出0
解题思路:
一开始看了很多题解都没懂,时间久了才慢慢明白
输出最大时,动态方程:sum[ j ] = max(sum[ j ],sum[ j-p[ i ].vol ]+p[ i ].val)
当求第k大时,讲sum[ ]扩展成为二维的 sum[ i ][ j ],i表示体积,j表示第j大
当我们要从20个队里面求出前十的身高,该怎么做呢
很简单,将20个队编号为1,2,3……20
从1队开始,挑选出前十的身高,记到数组a[ ]
走到2队,再次挑选出前十的身高,记到数组b[ ]
这时候不要急着道3队,先将1队,2队中前十的身高记录到数组s[ ]中
然后依次走过去,不断更新s[ ]数组
这题类似
题意:
T组数据
n个骨头,背包容量v,k(输出第k大)
每个骨头的价值
每个骨头的体积
输出最终价值第k大的的价值,如果所有的价值种数小于k,就输出0
解题思路:
一开始看了很多题解都没懂,时间久了才慢慢明白
输出最大时,动态方程:sum[ j ] = max(sum[ j ],sum[ j-p[ i ].vol ]+p[ i ].val)
当求第k大时,讲sum[ ]扩展成为二维的 sum[ i ][ j ],i表示体积,j表示第j大
当我们要从20个队里面求出前十的身高,该怎么做呢
很简单,将20个队编号为1,2,3……20
从1队开始,挑选出前十的身高,记到数组a[ ]
走到2队,再次挑选出前十的身高,记到数组b[ ]
这时候不要急着道3队,先将1队,2队中前十的身高记录到数组s[ ]中
然后依次走过去,不断更新s[ ]数组
这题类似
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct node { int vol,val; }p[105]; __int64 sum[1005][35],a[1005],b[1005]; int main() { int t; scanf("%d",&t); while(t--) { int n,v,k; scanf("%d%d%d",&n,&v,&k); memset(sum,0,sizeof(sum)); for(int i=0;i<n;i++) scanf("%d",&p[i].val); for(int i=0;i<n;i++) scanf("%d",&p[i].vol); for(int i=0;i<n;i++) { for(int j=v;j>=p[i].vol;j--) { for(int li=1;li<=k;li++) { a[li]=sum[j][li];//不放入第i个 b[li]=sum[j-p[i].vol][li]+p[i].val;//放入第i个 } int xa=1,xb=1,w=1; a[k+1]=b[k+1]=-1; while(w<=k && (xa<=k || xb<=k))//更新前k个sum[][] { if(a[xa]<b[xb]) { sum[j][w]=b[xb]; xb++; } else { sum[j][w]=a[xa]; xa++; } if(sum[j][w]!=sum[j][w-1] || w==1) w++;//防止重复 } } } printf("%I64d\n",sum[v][k]); } return 0; }
相关文章推荐
- Java基础学习之内部类
- python标准库:collections和heapq模块
- python模块 - collections模块
- LeetCode Single Number (找不不重复元素)
- 存储学习笔记第一节
- C++ Primer快速入门之五:实用的模板库
- winform中的dateTimePicker控件怎么设置它的默认值为空
- 《JavaScript设计模式与开发实践》读书笔记之模板方法模式
- linux下Oracle自启动配置及启动脚本 12c 测试通过
- linux下helloworld的简单编译过程
- 二维数组的选择排序
- PHP,C++,Mysql
- 2015071805 - 所有的都是体验
- [BZOJ1036][ZJOI2008]树的统计Count
- 2015.07.18总结
- 生命不息,奋斗不止
- python基础
- CMake学习笔记
- 硬件路由转发原理浅析
- Amr and The Large Array