洛谷题目链接:多人背包

题目描述

求01背包前k优解的价值和

输入输出格式

输入格式:

第一行三个数K、V、N

接下来每行两个数,表示体积和价值

输出格式:

前k优解的价值和

输入输出样例

输入样例#1:

2 10 5

3 12

7 20

2 4

5 6

1 1

输出样例#1:

57

说明

对于100%的数据, \(K\le 50,V\le 5000,N\le 200\)


题意已经很清楚了,就不多赘述了.


题解:

首先考虑一下如何做01背包.显然有$$f[j]=max(f[j], f[j-cost[i]]+value[i])$$.那么我们应该如何记录这个前\(k\)优的解呢?

首先是应该想到将前\(k\)优的解加入状态的转移中.先定义状态\(f[j][k]\)表示\(j\)的容量的第\(k\)优解的值.考虑一下转移的情况,显然\(f[j][k]\)的情况只能由\(f[j][k]\)和\(f[j-cost[i]][1...k]\)转移而来(其实这个\(1...k\)是一个确定的值,因为\(k\)越大,\(f[j-cost[i]][1...k]\)越小,也就是说这个是单调的.肯定只有一个值能转移到\(f[j][k]\)的状态).

那么既然这个是单调的,并且又只有两种决策,那么其实这里是可以用归并来求解最大值的.在枚举的时候,可以用两个指针记录已经转移到第几个状态.每次选择大的那一个,最后归并回原数组(这里我是一边枚举一边归并的).

#include<bits/stdc++.h>
using namespace std;
const int V=5000+5;
const int N=200+5;
const int K=50+5; int n, v, k, c[N], w[N], q[K], ans = 0;
int f[V][K]; int main(){
cin >> k >> v >> n;
memset(f, 128, sizeof(f)); f[0][1] = 0;
for(int i=1;i<=n;i++) cin >> c[i] >> w[i];
for(int i=1;i<=n;i++)
for(int j=v;j>=c[i];j--){
int now = 1, last = 1, cnt = 0;
while(cnt < k){
if(f[j][now] > f[j-c[i]][last]+w[i])
q[++cnt] = f[j][now++];
else q[++cnt] = f[j-c[i]][last++]+w[i];
}
for(int o=1;o<=k;o++) f[j][o] = q[o];
}
for(int i=1;i<=k;i++) ans += f[v][i];
printf("%d\n",ans);
return 0;
}

[洛谷P1858] 多人背包的更多相关文章

  1. 洛谷 P1858 多人背包 DP

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

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

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

  3. 洛谷 P1858 多人背包

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

  4. 洛谷P1858 多人背包 多人背包板子题/多人背包学习笔记

    ,,,本来自以为,我dp学得还挺好的 然后今天一考发现都不会啊QAQ 连最基础的知识点都不清楚啊QAQ 所以就来写个题解嘛! 先放下板子题 其实我jio得,这题只要大概了解方法就不是很难鸭,,,毕竟是 ...

  5. 解题:洛谷 p1858 多人背包

    题面 设$dp[i][j]$表示容量为$i$时的第$j$优解,因为是优解,肯定$dp[i][j]$是随着$j$增大不断递减的,这样的话对于一个新加进来的物品,它只可能从两个容量的转移的前$k$优解中转 ...

  6. P1858 多人背包

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

  7. 【洛谷P1858】多人背包

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

  8. 洛谷P4495 奇怪的背包 [HAOI2018] 数论

    正解:数论+dp 解题报告: 传送门! 首先看到这题,跳无数次,自然而然可以想到之前考过好几次了的一个结论——如果只考虑无限放置i,它可以且仅可以跳到gcd(p,v[i]) 举一反三一下,如果有多个i ...

  9. 洛谷P4138 挂饰 背包

    正解:背包dp 解题报告: 昂先放链接qwq 感觉还挺妙的,,,真的我觉得我直接做可能是想不到背包的,,,我大概想不出是个背包的QAQ 但是知道是背包之后觉得,哦,好像长得也确实挺背包的吼,而且其实是 ...

随机推荐

  1. VUE中组件的使用

    关于vue组件引用 使用Nodejs的方法 被引用的组件要暴露 module.exports={}; 引用时 用 var abc= require("组件的路径") 然后 就可以用 ...

  2. java报错:Exception in thread "main" java.lang.NoSuchFieldError: INSTANCE

    Exception in thread "main" java.lang.NoSuchFieldError: INSTANCE at org.apache.http.conn.ss ...

  3. 再学习Webform页面生命周期

    参考文章: 在vs2010,新建一个aspx页面,页面头部有一行代码: <%@ Page Language="C#" AutoEventWireup="true&q ...

  4. aria2 on ubuntu

    http://www.5yun.org/9102.html http://jpollo.logdown.com/posts/160847-aria2c-and-yaaw aria2c --enable ...

  5. .getClass()和.class的区别

    一直在想.class和.getClass()的区别,思索良久,有点思绪,然后有网上搜了搜,找到了如下的一篇文章,与大家分享. 原来为就是涉及到java的反射----- Java反射学习 所谓反射,可以 ...

  6. java---StringBuilder类的用法(转载)

    转载自http://blog.csdn.net/zi_jun/article/details/7624999 String对象是不可改变的.每次使用 System.String类中的方法之一时,都要在 ...

  7. TCP系列36—窗口管理&流控—10、linux下的异常报文系列接收

    在这篇文章中我们看一下server端在接收到异常数据系列时的处理,主要目的是通过wireshark示例对这些异常数据系列的处理有一个直观的认识,感兴趣的自行阅读相关代码和协议,这里不再进行详细介绍 在 ...

  8. <Effective C++>读书摘要--Implementations<一>

    1.For the most part, coming up with appropriate definitions for your classes (and class templates) a ...

  9. OSG配置捷径,VS2013+WIN10

    在自己电脑上用CMAKE已经编译好了,上传到百度云里面了. 环境是WIN10+VS2013. 链接:http://pan.baidu.com/s/1hrO7GFE 密码:fwkw 解压之后放在C盘或者 ...

  10. Unity3d学习日记(一)

      闲来无事开始自学unity3d,发现还挺容易入门的,添加资源文件以及用c#编写脚本都很方便.   前面在Unity官方教程上自学了一段时间,跟着教程写了个space_shooter的小游戏,虽然游 ...