背包求第k优解 vijos 1412
2014-05-17 15:11
281 查看
题目:
vijos : https://vijos.org/p/1412
思路:
类似01背包,在放缩的过程中用数组记录前k大的数。
AC代码:
vijos : https://vijos.org/p/1412
思路:
类似01背包,在放缩的过程中用数组记录前k大的数。
AC代码:
#include<cstdio> #include<iostream> using namespace std; const int M = 5000 + 20; const int S = 220; const int L = 60; const int INF = -1e5; int dp[M][L], n, k, m, v[S], w[S], q1[L], q2[L]; main() { scanf("%d %d %d", &k, &m, &n); for(int i = 0; i < n; i++) scanf("%d %d", &w[i], &v[i]); for(int i = 0; i <= m; i++) for(int j = 0; j <= k; j++) dp[i][j] = INF;//先赋一个无限小的数,这样如果不是正好装满背包的权值也会变得无限小。 dp[0][0] = 0; for(int i = 0; i < n; i++) for(int j = m; j >= w[i]; j--) { int p; for(p = 0; p < k; p++)//考虑01背包的dp[j] = max(dp[j], dp[j - w[i]] + v[i]),这里是每当添加一个新物品时,对所有的k进行一次这样的操作。 { q1[p] = dp[j][p]; q2[p] = dp[j - w[i]][p] + v[i]; } p = 0; int l1 = 0, l2 = 0; while(p < k) { if(q1[l1] > q2[l2]) dp[j][p] = q1[l1++]; else dp[j][p] = q2[l2++]; p++; } } int ans = 0; for(int i = 0; i < k; i++) ans += dp[m][i]; printf("%d\n", ans); }
相关文章推荐
- 学习笔记:vijos1412[多人背包] 背包k优解...
- 背包问题求第K优解
- 背包问题第k优解
- hdu 2639 次优解、第K优解 0-1背包
- hdu 2639 (Bone Collector II) 0-1背包的第k优解
- 杭电2639————DP之01背包第k优解
- RQNOJ_123 多人背包 【背包第K优解】
- 背包问题小总结 习题(动态规划01背包(第k优解)完全背包,多重背包)acm杭电HDU2639,HDU2602,HDU1114,HDU2191
- HDU 2639(Bone Collector II)背包问题求第K优解
- hdu 2639Bone Collector II 背包的第K优解问题
- 【01背包求第K优解】HDU 2639 Bone Collector II
- 背包问题中求次优解,第K优解的方法
- vijos P1412多人背包 DP的前k优解
- 2639-Bone Collector II (01背包之第k优解)
- Bone Collector II - HDU 2639 背包第k优解
- 关于01背包求第k优解
- 01背包_第k优解
- 【Vijos1412】多人背包(背包DP)
- hdu2639背包问题第K优解
- hdu 2639 01背包的 第K优解