HDU2639Bone Collector II(01背包变形)
2015-10-23 12:31
169 查看
01背包,求第k大。
以前看k短路的时候看过代码以为懂了 = =结果还是跑去看了别人的代码才会。果然要自己写一遍才行啊 0.0难得1A。。
每次把可能的2k种求出来,求前k个。注意要不一样的k个数。。
以前看k短路的时候看过代码以为懂了 = =结果还是跑去看了别人的代码才会。果然要自己写一遍才行啊 0.0难得1A。。
每次把可能的2k种求出来,求前k个。注意要不一样的k个数。。
/************************************************************** Problem : 2639 ( Bone Collector II ) Judge Status : Accepted RunId : 15212165 Language : G++ Author : G_lory Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta ***************************************************************/ #include <iostream> #include <cstdio> #include <cstring> using namespace std; //N <= 100 , V <= 1000 , K <= 30 const int MAXN = 105; const int MAXV = 1005; const int MAXK = 35; int val[MAXN]; int vol[MAXN]; int dp[MAXV][MAXK]; int a[MAXK], b[MAXK]; int main() { int n, v, k; int t; cin >> t; while (t--) { memset(dp, 0, sizeof dp); cin >> n >> v >> k; for (int i = 0; i < n; ++i) cin >> val[i]; for (int i = 0; i < n; ++i) cin >> vol[i]; for (int i = 0; i < n; ++i) { for (int j = v; j >= vol[i]; --j) { for (int q = 0; q < k; ++q) { a[q] = dp[j][q]; b[q] = dp[j - vol[i]][q] + val[i]; } int ic = 0, jc = 0; int ck = 0; while (ic < k && jc < k && ck < k) { if (a[ic] < b[jc]) { if (ck == 0 || b[jc] < dp[j][ck - 1]) dp[j][ck++] = b[jc]; jc++; } else { if (ck == 0 || a[ic] < dp[j][ck - 1]) dp[j][ck++] = a[ic]; ic++; } } while (ic < k && ck < k) { if (ck == 0 || a[ic] < dp[j][ck - 1]) dp[j][ck++] = a[ic]; ic++; } while (jc < k && ck < k) { if (ck == 0 || b[jc] < dp[j][ck - 1]) dp[j][ck++] = b[jc]; jc++; } } } cout << dp[v][k - 1] << endl; } return 0; }
相关文章推荐
- 个人使用angular的一些小总结
- 经典的lcs问题(输出公共子序列)
- Homestead 使用总结
- 5、WPF 4.5 in VB 界面切换
- Redis学习笔记一、开篇
- PHP网络数据抓取方法
- jvm对大对象分配内存的特殊处理(转)
- 解决Firefox 的Adobe Flash更新问题。
- 移动页面自适应搜索框
- 39.Ugly Number II(动态规划)
- iOS开发~视频处理
- LITTLE SHOP OF FLOWERS
- 分区
- 大道至简第四章
- 关于Linux命令ls的一道笔试题
- 通过dumpsys meminfo命令查看一个进程的内存情况
- 关于rand和srand函数使用的一点心得
- VS2010 DSOFrame 编译遇到的问题总结
- 考虑overflow
- JDBC程序更新数据库中记录的方法