【01背包求第K优解】HDU 2639 Bone Collector II
2017-01-22 18:40
288 查看
题意:01背包求第k优解
题解:因为01背包其实把所有可能的情况全列举了,取第k优解无非将数组增加一维,f[i][v][k]表示在V体积里前i个物品第k大的解。在求解过程中再每次运算时,运算k次即可,过程需要两个额外数组维护。
题解:因为01背包其实把所有可能的情况全列举了,取第k优解无非将数组增加一维,f[i][v][k]表示在V体积里前i个物品第k大的解。在求解过程中再每次运算时,运算k次即可,过程需要两个额外数组维护。
#include <iostream> #include <stdio.h> #include <string.h> #include <math.h> #include <map> #include <queue> #include <algorithm> using namespace std; const int N = 1010; const int INF = 0x3f3f3f3f; int f [35]; int v[105],w[105],A[35],B[35]; int main() { int T; scanf("%d",&T); while(T--) { int n,W,k; scanf("%d%d%d",&n,&W,&k); memset(f,0,sizeof(f)); for(int i = 1; i <= n; i++) scanf("%d",&v[i]); for(int i = 1; i <= n; i++) scanf("%d",&w[i]); for(int i = 1; i <= n; i++) { for(int j = W; j >= w[i]; j--) { int p; for(p = 1; p <= k; p++) { A[p] = f[j][p]; B[p] = f[j-w[i]][p]+v[i]; } A[p] = B[p] = -1; int a,b,c; a = b = c = 1; while(c <= k && (A[a] != -1 || B[b] != -1)) { if(A[a] > B[b]) f[j][c] = A[a++]; else f[j][c] = B[b++]; if(f[j][c] != f[j][c-1]) c++; } } } printf("%d\n",f[W][k]); } return 0; }
相关文章推荐
- HDU-2639 Bone Collector II (01背包 找第k优解 入门题)
- Bone Collector II - HDU 2639 背包第k优解
- hdu 2639 01背包的 第K优解
- 杭电2639————DP之01背包第k优解
- HDU 2639 背包第k优解
- hdu 2639Bone Collector II 背包的第K优解问题
- 01背包_第k优解
- 背包问题小总结 习题(动态规划01背包(第k优解)完全背包,多重背包)acm杭电HDU2639,HDU2602,HDU1114,HDU2191
- 关于01背包求第k优解
- HDU 2639 Bone Collector II / 第K大的01背包
- HDU 2639 01背包求第k大
- 2639-Bone Collector II (01背包之第k优解)
- HDU2639_Bone Collector II 01背包求第K优解
- hdu 2639 (Bone Collector II) 0-1背包的第k优解
- HDU 2639 Bone Collector II [动态规划 第k大01背包]
- hdu 2639Bone Collector II(01背包求第k大)
- HDU 2639(Bone Collector II)背包问题求第K优解
- hdu 2639 次优解、第K优解 0-1背包
- hdu2639 Bone Collector II 01背包边形,第k大价值
- HDU 2639 Bone Collector II(01背包变形【第K大最优解】)