hdu 2639 Bone Collector II(01背包)(第k优解)
2015-12-24 01:29
531 查看
hdu 2639 Bone Collector II
分析
这是http://blog.csdn.net/pibaixinghei/article/details/50382013这道题的升级版,也就是在基础的01背包上增加了条件,问的是第k优解。原来的01背包,一维dp存的就是第一优解的状态,既然现在要第k优,则数组再增加一维,记录第k优的值,而且合并的时候也不能是简单的max(。。。) 而是应该分别记录dp[j][k]的值以及dp[j-vo[i]][k]的值,并由他们的大小进行合并,得到k个最优解,最后输出即可。应该想到要增加一位,同时结合背包的原理,更新出k个解。
注意输入是先输所有价值,之后输所有重量。
问题
http://acm.hdu.edu.cn/showproblem.php?pid=2639代码
#include <iostream> #include <cstring> #include <ctime> #include <fstream> #include <cstdlib> #include <algorithm> #include <set> #include <vector> using namespace std; long dp[10010][35]; long va[110],vo[110]; int a[35],b[35]; int main() { int T; scanf("%d",&T); while(T--) { memset(dp,0,sizeof(dp)); int N,V,K; scanf("%d %d %d",&N,&V,&K); for(int i=1; i<=N; i++) scanf("%d",&va[i]); for(int i=1; i<=N; i++) scanf("%d",&vo[i]); for(int i=1; i<=N; i++) for(int j=V; j>=vo[i]; j--) { for(int k=0; k<=K; k++) { a[k]=dp[j][k]; b[k]=dp[j-vo[i]][k]+va[i]; } a[K+1]=b[K+1]=-1; int tt,ii,jj; tt=ii=jj=1; while(tt<=K&&(a[ii]!=-1||b[jj]!=-1)) { if(a[ii]<b[jj]) dp[j][tt]=b[jj++]; else dp[j][tt]=a[ii++]; if(dp[j][tt]!=dp[j][tt-1]) tt++; } } cout<<dp[V][K]<<endl; } return 0; }
相关文章推荐
- Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modules (web项目不能加载到服务器))
- 279. Perfect Squares-Leetcode(关于DP的再深入研究)
- 请教一个EasyTouch的问题,如何实现摇杆和之外的触模区域独立
- AsObject()转换成C#中的实体类
- 记circle_of_life
- Java虚拟机(一)之开篇
- 2-7-集合运算(A-B)∪(B-A)-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版
- osg3.2.1+vs2010+win7编译方法
- mysql5.7多源复制
- [ISUX译]iOS 9人机界面指南(三):iOS 技术
- 【个人日记】
- AccessDataSource配置数据源,但组件是灰色
- 2——3树
- 浅谈5.7limit优化
- [ISUX译]iOS 9人机界面指南(二):设计策略
- 高德地图搜索提示获取信息回传activity刷新ui(二)
- 运算符重载的例子
- Eclipse导入Maven工程报异常
- LNMP nginx配置和 php-fpm通道详解
- Maven settings 开源中国 镜像并下载本地仓库