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 优解来说,只需对状态额外 ...
随机推荐
- php图片上传旋转压缩方法
用到php的exif扩展,需要开启exif 在php.ini文件中去掉exif组件的注释 extension=php_mbstring.dll //要放在php_exif.dll前面让它先加载 ext ...
- python学习之路1(基本语法元素)
1.变量与简单数据类型 1.1变量 变量就是给你所写代码的信息起一个名字,用来存储此信息,使信息变得更加的简洁易读, 例如:message = "Hello World!",其中m ...
- lan口和wan口的配置
路由器的一排网线接口,分为 lan 和 wan .但不是谁生来就是lan口 或者 wan口 . 也没有谁规定就一个wan口 就只有一个. 网口就是网口, 决定它是 lan口 还是 wan口 ,是由我们 ...
- dijkstra算法与优先队列
这是鄙人的第一篇技术博客,作为算法小菜鸟外加轻度写作障碍者,写技术博客也算是对自己的一种挑战和鞭策吧~ 言归正传,什么是dijkstra算法呢? -dijkstra算法是一种解决最短路径问题的简单有效 ...
- Android 使用RxJava实现一个发布/订阅事件总线
1.简单介绍 1.1.发布/订阅事件主要用于网络请求的回调. 事件总线可以使Android各组件之间的通信变得简单,而且可以解耦. 其实RxJava实现事件总线和EventBus比较类似,他们都依据与 ...
- CodeForces 778D Parquet Re-laying 构造
题意: 有两个\(n \times m\)的矩阵\(A,B\),都是由\(1 \times 2\)的砖块铺成,代表初始状态和结束状态 有一种操作可以把两个砖块拼成的\(2 \times 2\)的矩形旋 ...
- java 值传递 和 引用传递
参考:(http://www.cnblogs.com/woshimrf/p/5263018.html) 参考:(http://www.cnblogs.com/binyue/p/3862276.html ...
- dealloc时取weakself引起崩溃
今天无意这中遇到一个奇怪的崩溃,先上引起崩溃的代码: - (void)dealloc { __weak __typeof(self)weak_self = self; NSLog(@"%@& ...
- 跟着学!教你开发第一个Java程序
今天我们的目标是开发人生中的第一个Java程序,虽然可能会很简单,但是这小小的一步却是跨入IT行业的一大步!下面我们来一起来仔细的了解开发的流程. 准备工作 1,作为一名准程序猿自备一台电脑那是必不可 ...
- 《Cracking the Coding Interview》——第16章:线程与锁——题目3
2014-04-27 19:26 题目:哲学家吃饭问题,死锁问题经典模型(专门用来黑哲学家的?). 解法:死锁四条件:1. 资源互斥.2. 请求保持.3. 非抢占.4. 循环等待.所以,某砖家拿起一只 ...