题目:http://www.rqnoj.cn/problem/123

  不得不说,RQNOJ 的机子跑得好慢呀,5*10的数据范围本地跑 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的更多相关文章

  1. P1858 多人背包

    P1858 多人背包 题目描述 求01背包前k优解的价值和 要求装满 调试日志: 初始化没有赋给 dp[0] Solution 首先补充个知识点啊, 要求装满的背包需要初始赋 \(-inf\), 边界 ...

  2. 洛谷 P1858 多人背包 解题报告

    P1858 多人背包 题目描述 求01背包前k优解的价值和 输入输出格式 输入格式: 第一行三个数\(K\).\(V\).\(N\) 接下来每行两个数,表示体积和价值 输出格式: 前k优解的价值和 说 ...

  3. [洛谷P1858] 多人背包

    洛谷题目链接:多人背包 题目描述 求01背包前k优解的价值和 输入输出格式 输入格式: 第一行三个数K.V.N 接下来每行两个数,表示体积和价值 输出格式: 前k优解的价值和 输入输出样例 输入样例# ...

  4. 背包【p1858】 多人背包(次优解 or 第k优解)

    题目描述--->p1858 多人背包 分析: 很明显,这题是背包问题的一种变形. 求解 次优解or第k优解. 表示刚开始有点懵,看题解也看不太懂. 又中途去补看了一下背包九讲 然后感觉有些理解, ...

  5. [XJOI]noip43 T2多人背包

    多人背包 DD 和好朋友们要去爬山啦!他们一共有 K 个人,每个人都会背一个包.这些包的容量是相同的,都是 V.可以装进背包里的一共有 N 种物品,每种物品都有给定的体积和价值.在 DD 看来,合理的 ...

  6. 洛谷 P1858 多人背包 DP

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 洛谷 P1858 多人背包 题目描述 求01背包前k优解的价值 ...

  7. 洛谷 P1858 多人背包

    求01背包前k优解的价值和 输入输出格式 Input/output 输入格式:第一行三个数K.V.N(k<=50,v<=5000,n<=200)接下来每行两个数,表示体积和价值输出格 ...

  8. 【动态规划】【归并】Vijos P1412 多人背包

    题目链接: https://vijos.org/p/1412 题目大意: 求01背包的前K优解,要求必须装满(1<=K<=50 0<=V<=5000 1<=N<=2 ...

  9. 【洛谷P1858】多人背包

    题目大意:求解 0-1 背包前 K 优解的和. 题解:首先,可知对于状态 \(dp[j]\) 来说,能够转移到该状态的只有 \(dp[j],dp[j-w[i]]\).对于 K 优解来说,只需对状态额外 ...

随机推荐

  1. SQL tp3.2 批量更新 saveAll

    /** * 批量更新数据 * @param [array] $datas [更新数据] * @param [string] $table_name [表名] */ public function sa ...

  2. Teaching Is a Fruitful Way to Learn【教学是一种有效的学习方式】

    Teaching Is a Fruitful Way to Learn For thousands of years, people have known that the best way to u ...

  3. mysql学习第二天函数

    -- 1.绝对值 select abs(-1)from dual -- 2.求平方根select sqrt(6)from dual -- 3.圆周率select pi()from dual -- 4. ...

  4. Matplotlib库介绍

    pyplot的plot()函数 pyplot的中文显示 pyplot的文本显示 pyplot的子绘图区域

  5. 【APUE】Chapter7 Process Environment

    这一章内容是Process的基础准备篇章.这一章的内容都是基于C Programm为例子. (一)进程开始: kernel → C start-up rountine → main function ...

  6. 关于JavaScript设计模式的学习(二)

    第二部分来了,是关于结构型的,同样的,还是在简书中,GitHub上也有代码示例和详细注释 简书:http://www.jianshu.com/p/face1be4b846 github:https:/ ...

  7. Java基础-6流程控制

    一).选择控制: 选择控制分为两种:if...else...和switch 单分支结构:这是最简单的一种选择结构,它只是简单的判断某个条件是否成立,如果成立就执行一段代码,语句形式为: if(条件表达 ...

  8. 【转载】法线贴图Nomal mapping 原理

    法线贴图多用在CG动画的渲染以及游戏画面的制作上,将具有高细节的模型通过映射烘焙出法线贴图,贴在低端模型的法线贴图通道上,使之拥有法线贴图的渲染效果,却可以大大降低渲染时需要的面数和计算内容,从而达到 ...

  9. (笔记) RealTimeRender[实时渲染] C2

    @author: 白袍小道 @来源:RealTime Render @建议书籍:龙书.RealTimeR第四版.GPUGem和PRO (来源:暗影不解释) 引点 这一章关注的管线中的管道功能,而非实现 ...

  10. java_链表反转

    定义一个Node节点类 1 public class Node { 2 public int value; 3 public Node next; 4 5 public Node(int value) ...