RQNOJ123_多人背包_C++_Pascal
题目:http://www.rqnoj.cn/problem/123
不得不说,RQNOJ 的机子跑得好慢呀,5*107 的数据范围本地跑 0.2s,服务器上愣是把我卡掉了,最后只好写了一份 Pascal 交上去
本地跑

OJ上跑

咳咳,言归正传
普通的背包是求出最优的那一钟方案,方程转移是 f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]),相当于把 2 个变量经比较后丢到 1 个变量里,也就是 k=1时的情况
而现在我们需要求最优的前 k 组方案,那么可以把数组再增加一维,变成把 2k 个变量经比较后丢进k个数里,也就是 2 个线性表丢进 1 个线性表里,由于线性表内数据是单调下降的,则可以按照归并排序的做法做
实现操作中还可以滚掉第一维,那么 j 就要递减枚举
以下是 C++ 的,但是会TLE
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std; const int V=,K=,maxint=;
int f[V][K],g[K];
int main()
{
int i,j,n,m,s,ans=,q1,q2,k,w,v;
scanf("%d%d%d",&m,&s,&n);
for (i=;i<=s;i++)
for (j=;j<=m;j++) f[i][j]=-maxint;
f[][]=;
for (i=;i<=n;i++)
{
scanf("%d%d",&w,&v);
for (j=s;j>=w;j--)
{
if (f[j-w][]<) continue;
q1=q2=;
for (k=;k<=m;k++)
if (f[j-w][q1]+v>f[j][q2]) g[k]=f[j-w][q1++]+v;
else g[k]=f[j][q2++];
for (k=;k<=m;k++) f[j][k]=g[k];
}
}
for (i=;i<=m;i++) ans+=f[s][i];
printf("%d\n",ans);
return ;
}
这个是 Pascal 的,可以AC
program xqz;
uses math;
const maxv=; maxk=;
type arr=array[..maxk] of longint;
var
c,w,i,j,m,n,k,mv,mk,l,r,b,p,e,s,t,v:longint;
yes:boolean;
f:array[..maxv,..maxk] of longint;
ans,now:int64;
procedure work(var a:arr; b,c:arr);
var l,r:longint;
begin
l:=; r:=;
while (l+r-<mk)and ((b[l]<>-)or(c[r]<>-)) do
begin
while (b[l]<>-)and((c[r]=-)or(b[l]>=c[r]+w))and(l+r-<mk) do
begin
a[l+r-]:=b[l]; inc(l);
end;
while (c[r]<>-)and((b[l]=-)or(b[l]<=c[r]+w))and(l+r-<mk) do
begin
a[l+r-]:=c[r]+w; inc(r);
end;
end;
end; begin
readln(mk,mv,n); fillchar(f,sizeof(f),$ff);
f[,]:=;
for i:= to n do
begin
readln(c,w); now:=now+c;
for j:=min(now,mv) downto c do
work(f[j],f[j],f[j-c])
end;
for k:= to mk do
inc(ans,f[mv,k]);
writeln(ans);
close(input); close(output);
end.
版权所有,转载请联系作者,违者必究
QQ:740929894
RQNOJ123_多人背包_C++_Pascal的更多相关文章
- P1858 多人背包
P1858 多人背包 题目描述 求01背包前k优解的价值和 要求装满 调试日志: 初始化没有赋给 dp[0] Solution 首先补充个知识点啊, 要求装满的背包需要初始赋 \(-inf\), 边界 ...
- 洛谷 P1858 多人背包 解题报告
P1858 多人背包 题目描述 求01背包前k优解的价值和 输入输出格式 输入格式: 第一行三个数\(K\).\(V\).\(N\) 接下来每行两个数,表示体积和价值 输出格式: 前k优解的价值和 说 ...
- [洛谷P1858] 多人背包
洛谷题目链接:多人背包 题目描述 求01背包前k优解的价值和 输入输出格式 输入格式: 第一行三个数K.V.N 接下来每行两个数,表示体积和价值 输出格式: 前k优解的价值和 输入输出样例 输入样例# ...
- 背包【p1858】 多人背包(次优解 or 第k优解)
题目描述--->p1858 多人背包 分析: 很明显,这题是背包问题的一种变形. 求解 次优解or第k优解. 表示刚开始有点懵,看题解也看不太懂. 又中途去补看了一下背包九讲 然后感觉有些理解, ...
- [XJOI]noip43 T2多人背包
多人背包 DD 和好朋友们要去爬山啦!他们一共有 K 个人,每个人都会背一个包.这些包的容量是相同的,都是 V.可以装进背包里的一共有 N 种物品,每种物品都有给定的体积和价值.在 DD 看来,合理的 ...
- 洛谷 P1858 多人背包 DP
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 洛谷 P1858 多人背包 题目描述 求01背包前k优解的价值 ...
- 洛谷 P1858 多人背包
求01背包前k优解的价值和 输入输出格式 Input/output 输入格式:第一行三个数K.V.N(k<=50,v<=5000,n<=200)接下来每行两个数,表示体积和价值输出格 ...
- 【动态规划】【归并】Vijos P1412 多人背包
题目链接: https://vijos.org/p/1412 题目大意: 求01背包的前K优解,要求必须装满(1<=K<=50 0<=V<=5000 1<=N<=2 ...
- 【洛谷P1858】多人背包
题目大意:求解 0-1 背包前 K 优解的和. 题解:首先,可知对于状态 \(dp[j]\) 来说,能够转移到该状态的只有 \(dp[j],dp[j-w[i]]\).对于 K 优解来说,只需对状态额外 ...
随机推荐
- PHPExcel 中文使用手册详解
/** * * execl数据导出 * 应用场景:订单导出 * @param string $title 模型名(如Member),用于导出生成文件名的前缀 * @param array $cellN ...
- Leetcode 538. 把二叉搜索树转换为累加树
题目链接 https://leetcode.com/problems/convert-bst-to-greater-tree/description/ 题目描述 大于它的节点值之和. 例如: 输入: ...
- 自定义注解不能拦截controller层
1,首先在springMVC的配置文件中,webapp/WEB-INF/servlet.xml,加上AOP的相关内容: <beans xmlns="http://www.springf ...
- 4 CSS的20/80个知识点
1.css的基本构成 样式选择器 id选择器 元素选择器 2.css的盒模型 border padding margin 3.Atom快捷键 4.程序 (1)初始程序 <!DOCTYPE htm ...
- 简洁好看的form样式收藏
本文转载自 http://www.laozuo.org/3495.html 为了方便自己查阅所以搬运过来,如有侵权希望原作者联系我删除不要突然去法院告我呀! 颜色样式啥的都可以根据需求自己调整的,这些 ...
- git命令行操作详解
目录 1.常用操作 1.1 新建代码库 1.2 配置 1.3 remote管理 1.4 添加和撤销操作 1.5 代码提交 1.6 分支操作 1.7 查看信息 1.8 pull操作 1.9 push操作 ...
- 《Cracking the Coding Interview》——第16章:线程与锁——题目4
2014-04-27 20:06 题目:设计一个类,只有在不产生死锁的时候才分配资源. 解法:不太清楚这个题是要分配何种资源,以何种形式?所以没能动手写个可运行的代码,只是闲扯了几句理论分析. 代码: ...
- USACO刷题之路,开始了
几天前,重新开始刷题了. 重新刷题有几个原因: 1.曾经的OI经历,如今除了悟性高些.知识多些,大多已经遗忘.不希望真的让之前的OI水平就这么丢了. 2.越来越觉得,刷题真的是一件很开心的事情.大学中 ...
- python multiprocessing.Pool 中map、map_async、apply、apply_async的区别
multiprocessing是python的多进程库,multiprocessing.dummy则是多线程的版本,使用都一样. 其中都有pool池的概念,进程池/线程池有共同的方法,其中方法对比如下 ...
- virt-install command
安装 virt-install --connect qemu:///system \ --virt-type=kvm \ --name windows2008 --ram --vcpus --arch ...