vijos P1412多人背包 DP的前k优解
2017-02-14 15:41
197 查看
https://vijos.org/p/1412
把dp设成,dp[i][v][k]表示在前i项中,拥有v这个背包,的第k大解是什么。
那么dp[i][v][1...k]就是在dp[i - 1][v][1...k]和dp[i - 1][v - w[i]][1...k] + val[i]中合并得来。
用O(k)的算法可以找出来,因为是有序的。
注意同一个物品只能用一次。
dp的初始化就有些不同。
View Code
把dp设成,dp[i][v][k]表示在前i项中,拥有v这个背包,的第k大解是什么。
那么dp[i][v][1...k]就是在dp[i - 1][v][1...k]和dp[i - 1][v - w[i]][1...k] + val[i]中合并得来。
用O(k)的算法可以找出来,因为是有序的。
注意同一个物品只能用一次。
dp的初始化就有些不同。
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <assert.h> #define IOS ios::sync_with_stdio(false) using namespace std; #define inf (0x3f3f3f3f) typedef long long int LL; #include <iostream> #include <sstream> #include <vector> #include <set> #include <map> #include <queue> #include <string> #include <bitset> const int maxn = 5000 + 20; int w[maxn], val[maxn]; int dp[maxn][50 + 20]; int k, tot, n; int a[maxn], b[maxn]; vector<int>vc; void work() { scanf("%d%d%d", &k, &tot, &n); for (int i = 1; i <= n; ++i) { scanf("%d%d", &w[i], &val[i]); } memset(dp, -0x3f, sizeof dp); dp[0][1] = 0; for (int i = 1; i <= n; ++i) { for (int v = tot; v >= w[i]; --v) { int lena = 0, lenb = 0; for (int h = 1; h <= k; ++h) { a[++lena] = dp[v][h]; b[++lenb] = dp[v - w[i]][h] + val[i]; } int toa = 1, tob = 1; for (int h = 1; h <= k; ++h) { if (a[toa] > b[tob] && toa <= lena) { dp[v][h] = a[toa++]; } else { dp[v][h] = b[tob++]; } } } } // cout << dp[tot][1] << endl; // cout << dp[tot][2] << endl; int ans = 0; for (int i = 1; i <= k; ++i) { ans += dp[tot][i]; } ans = max(ans, 0); cout << ans << endl; } int main() { #ifdef local freopen("data.txt", "r", stdin); // freopen("data.txt", "w", stdout); #endif work(); return 0; }
View Code
相关文章推荐
- 背包求第k优解 vijos 1412
- 依赖背包dp NOIP2006 vijos 1313 金明的预算方案
- Vijos P1412 多人背包
- 分组背包dp+并查集 vijos1250
- vijos P1836HYS与七夕节大作战 (01背包之2--转换dp对象)
- 树形背包DP的两种优化方式——vijos1676、codeforces815c
- vijos1426(状态压缩背包dp)
- 【Vijos1412】多人背包(背包DP)
- 学习笔记:vijos1412[多人背包] 背包k优解...
- 【动态规划】【归并】Vijos P1412 多人背包
- 【Vijos1250】最勇敢的机器人(并查集,分组背包DP)
- Vijos1392拼拼图的小衫[背包DP|二维信息DP]
- 杭电2639————DP之01背包第k优解
- poj 1114 Piggy-Bank 完全背包 dp
- Vijos 1144 小胖守皇宫 [树形dp]
- HDU 4044 GeoDefense 树形dp:树形背包★
- Codeforces Codeforces Round #319 (Div. 2) B. Modulo Sum 背包dp
- CodeChef Cards, bags and coins [DP 泛型背包]
- 0-1背包问题入门小结 动态规划(DP)经典题目 POJ324 POJ1276
- [swust]Fighting for the 2017 season contest 7 雀巢原理,并查集,离线BIT,中位数,前缀和,贪心,背包DP