vijos P1412多人背包 DP的前k优解
把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 = + ;
int w[maxn], val[maxn];
int dp[maxn][ + ];
int k, tot, n;
int a[maxn], b[maxn];
vector<int>vc;
void work() {
scanf("%d%d%d", &k, &tot, &n);
for (int i = ; i <= n; ++i) {
scanf("%d%d", &w[i], &val[i]);
}
memset(dp, -0x3f, sizeof dp);
dp[][] = ;
for (int i = ; i <= n; ++i) {
for (int v = tot; v >= w[i]; --v) {
int lena = , lenb = ;
for (int h = ; h <= k; ++h) {
a[++lena] = dp[v][h];
b[++lenb] = dp[v - w[i]][h] + val[i];
}
int toa = , tob = ;
for (int h = ; 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 = ;
for (int i = ; i <= k; ++i) {
ans += dp[tot][i];
}
ans = max(ans, );
cout << ans << endl;
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
work();
return ;
}
vijos P1412多人背包 DP的前k优解的更多相关文章
- 【动态规划】【归并】Vijos P1412 多人背包
题目链接: https://vijos.org/p/1412 题目大意: 求01背包的前K优解,要求必须装满(1<=K<=50 0<=V<=5000 1<=N<=2 ...
- dp之01背包hdu2639(第k优解)
http://acm.hdu.edu.cn/showproblem.php?pid=2639 题意:给出一行价值,一行体积,让你在v体积的范围内找出第k大的值.......(注意,不要 和它的第一题混 ...
- 01背包之求第K优解——Bone Collector II
http://acm.hdu.edu.cn/showproblem.php?pid=2639 题目大意是,往背包里赛骨头,求第K优解,在普通01背包的基础上,增加一维空间,那么F[i,v,k]可以理解 ...
- hdu 2639 Bone Collector II (01背包,求第k优解)
这题和典型的01背包求最优解不同,是要求第k优解,所以,最直观的想法就是在01背包的基础上再增加一维表示第k大时的价值.具体思路见下面的参考链接,说的很详细 参考连接:http://laiba2004 ...
- 洛谷 P1858 多人背包 DP
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 洛谷 P1858 多人背包 题目描述 求01背包前k优解的价值 ...
- (01背包 第k优解) Bone Collector II(hdu 2639)
http://acm.hdu.edu.cn/showproblem.php?pid=2639 Problem Description The title of this problem i ...
- Bone Collector II---hdu2639(01背包求第k优解)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639求01背包的第k大解.合并两个有序序列 选取物品i,或不选.最终的结果,是我们能在O(1)的时间内 ...
- HDU 2639 (01背包第k优解)
/* 01背包第k优解问题 f[i][j][k] 前i个物品体积为j的第k优解 对于每次的ij状态 记下之前的两种状态 i-1 j-w[i] (选i) i-1 j (不选i) 分别k个 然后归并排序并 ...
- hdu2639(背包求第k优解)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639 题意:给出一行价值,一行体积,让你在v体积的范围内找出第k大的值 分析:dp[i][j][k]表 ...
随机推荐
- 学习Opencv 2.4.9 (一)---Opencv + vs2012环境配置
作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 首先获得最新的Opencv 2.4.9源代码:opencv源代码下载 一.Opencv环境变量配置 ...
- 基于github for windows&github的团队协作基本操作
首先,我们要在github上团队协作.先要建立一个team.这个自行百度,在github上操作就是. 点击打开链接 这是我的有道文章(假设看不到图片的话) 今天主要讲的是怎么操作github for ...
- Library Project里面使用Case语句判断R.id值报错。case expressions must be constant expressions
原文地址:http://blog.csdn.net/wchinaw/article/details/7325641 在一般的Android项目里R里面的资源声明看起来是这样的: public stat ...
- python3 安装 #zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz Modules/Setup.dist https://askubuntu ...
- UVALive3415 Guardian of Decency —— 最大独立集
题目链接:https://vjudge.net/problem/UVALive-3415 题解: 题意:选出尽可能多的人, 使得他(她)们之间不会擦出火花.即求出最大独立集. 1.因为性别有男女之分, ...
- 【HAOI 2008】 硬币购物
[题目链接] 点击打开链接 [算法] 此题是一道好题! 首先,我们发现 : 付款方法数 = 不受限制的方法数 - 受限制的方法数 那么,我们怎么求呢? 我们用dp求出不受限制的方法数(f[i]表示买i ...
- RobotFramework模拟手机浏览器
转自 http://blog.csdn.net/max229max/article/details/70808867 感谢max bai提供的思路 Python - Selenium Chrome 模 ...
- 3.jeesite主从表开发
1. 2 3. 4. 5. 6. 7. 8. 9. 10.
- Gym 100512B Betting Fast (题意+概率)
题意:你开始有 s 元钱,然后你要在 t 场内赚到 n 元,每次赢的概率是 p,并且要越快越好. 析:当时没注意这个条件,要越快越好,然后写概率dp,怎么看也不像是对.其实是每次赌 min(s, n- ...
- Linux系统挂载NTFS文件系统(转载)
转自:http://hermesbox.blogbus.com/logs/47386987.html 今天尝试并成功的将一块500G的移动硬盘挂载到了RHEL5的系统上,甚感欣慰.想到也许以后自己或其 ...