HDOJ2639(01背包第k最优解模板题)
2017-10-26 21:03
288 查看
#include <iostream> #include <cstring> #include <string> #include <cstdio> #include <algorithm> #include <stack> #include <math.h> #include<iostream> #include <map> using namespace std; #define INF 0xfffff;//0x代表十六进制 #define M 1050 int dp[M][M], b[M], c[M]; //dpij指质量为i时的第j种最优解决方案 struct aa { int w, v; }a[M]; int main() { int t; cin >> t; for (int i = 0; i < t; i++) { memset(dp, 0, sizeof(dp)); int n, v, k, x, y, z, k1; cin >> n >> v >> k; for (int i = 0; i < n; i++) cin >> a[i].v; for (int i = 0; i < n; i++) cin >> a[i].w; for (int i = 0; i < n; i++) { for (int j = v; j >= a[i].w; j--) { for (k1 = 1; k1 <= k; k1++) { b[k1] = dp[j][k1]; //分别记录放与不放 c[k1] = dp[j - a[i].w][k1] + a[i].v; } b[k1] = c[k1] = -1; x = y = z = 1; while (z <= k && (x <= k || y <= k)) { if (b[x] > c[y]) dp[j][z] = b[x++]; else dp[j][z] = c[y++]; if (dp[j][z] != dp[j][z - 1]) z += 1; //只要和上一个最优解不一样 那就进行下一个最优解计算 } } } cout << dp[v][k] << endl; } }
相关文章推荐
- hdu(2639)(01背包的第k最优解)
- Hdu 2639 Bone Collector II(第K大最优解01背包)
- hdu 2639 【01背包的第k个最优解】
- hdu 2639 (第k小的01背包)
- Hduoj2639【01背包+第k优解】
- HDU 2639 Bone Collector II(01背包变形【第K大最优解】)
- HDOJ 2639 Bone Collector II(01||第K大背包)
- HDU 2639(01背包第K大)
- hdu 2639 Bone Collector II(01背包的第k值)
- hdu 2639 Bone Collector II(求第k优解 01背包)
- hdu 2639 Bone Collector II(01背包)(第k优解)
- hdu 2639 Bone Collector II (01背包,第k优解问题)
- [HDOJ2639]Bone Collector II(第k优01背包)
- HDOJ 2192多重背包 01背包模板
- 杭电 2639 Bone Collector II【01背包第k优解】
- 01背包变种 第k解问题 hdu 2639
- Bone Collector II HDU - 2639 01背包,第k优解
- HDU 2639 Bone Collector II 【01背包的第k优解】
- HDOJ 2639 Bone Collector II (背包求第k大)
- 2639骨头问题2(01背包的第k大值)