hdu2639 Bone Collector II 01背包边形,第k大价值
2013-04-02 15:56
513 查看
链接:点我
现在01的基础上多加一维,dp[v][k],表示在v空间下第k大的价值。。。
更新的时候有两个数组A、B,A记录选择第i个物品的从大到小排列,B记录不选择的从大到小排列,然后合并AB,选出AB里面前k个最大的。合并到dp中。。。
现在01的基础上多加一维,dp[v][k],表示在v空间下第k大的价值。。。
更新的时候有两个数组A、B,A记录选择第i个物品的从大到小排列,B记录不选择的从大到小排列,然后合并AB,选出AB里面前k个最大的。合并到dp中。。。
#include <iostream> #include <cstdio> using namespace std; #define max(a,b) ((a)>(b)?(a):(b)) const int maxn = 1005; int main() { int T; scanf("%d", &T); int dp[maxn][33], val[maxn], vol[maxn], A[33], B[33]; while (T--) { int n, v, k; scanf("%d %d %d", &n, &v, &k); int i, j, kk; for (i=0; i<n; i++) scanf("%d", &val[i]); for (i=0; i<n; i++) scanf("%d", &vol[i]); memset(dp, 0, sizeof(dp)); int a, b, c; for (i=0; i<n; i++) for (j=v; j>=vol[i]; j--) { for (kk=1; kk<=k; kk++) { A[kk] = dp[j-vol[i]][kk] + val[i]; B[kk] = dp[j][kk]; } A[kk] = -1, B[kk] = -1; a = b = c = 1; while (c<=k && (A[a] != -1 || B[b] != -1)) { if (A[a] > B[b]) dp[j][c] = A[a++]; else dp[j][c] = B[b++]; if (dp[j][c] != dp[j][c-1]) c++; } } printf("%d\n", dp[v][k]); } return 0; }
相关文章推荐
- HDU 2639 Bone Collector II(01背包变形【第K大最优解】)
- HDU-2639 Bone Collector II (01背包 找第k优解 入门题)
- HDU 2639 Bone Collector II [动态规划 第k大01背包]
- HDU 2639 Bone Collector II / 第K大的01背包
- hdu 2639 Bone Collector II(第K大背包)
- HDU 2639 Bone Collector II(01背包变型)
- hdu 2639 Bone Collector II(01背包 第K大价值)
- HDU 2639 Bone Collector II (求第K大的背包)
- Bone Collector II - HDU 2639 背包第k优解
- HDU 2639 Bone Collector II(01背包变型)
- hdu 2639 Bone Collector II (dp 01背包求第k优解)
- hdu 2639 (Bone Collector II) 0-1背包的第k优解
- HDOJ 2639 Bone Collector II(01||第K大背包)
- 2639-Bone Collector II (01背包之第k优解)
- hdu 2639 Bone Collector II(01背包求第k优解)
- HDU 2639(Bone Collector II)背包问题求第K优解
- HDU 2639 Bone Collector II(DP:01背包)
- hdu-2639-Bone Collector II【第K大背包】
- hdu-2639-01背包变形之求第k优解-Bone Collector II
- HDU--2639--Bone Collector II--01背包