多人背包

DD 和好朋友们要去爬山啦!他们一共有 K 个人,每个人都会背一个包。这些包的容量是相同的,都是 V。可以装进背包里的一共有 N 种物品,每种物品都有给定的体积和价值。
在 DD 看来,合理的背包安排方案是这样的:
1. 每个人背包里装的物品的总体积恰等于包的容量。 
2. 每个包里的每种物品最多只有一件,但两个不同的包中可以存在相同的物品。 
3. 任意两个人,他们包里的物品清单不能完全相同。 
在满足以上要求的前提下,所有包里的所有物品的总价值最大是多少呢?

输入格式:

第一行有三个整数:K、V、N。
第二行开始的 N 行,每行有两个整数,分别代表这件物品的体积和价值。

输出格式:

只需输出一个整数,即在满足以上要求的前提下所有物品的总价值的最大值。

样例输入:

2 10 5
3 12
7 20
2 4
5 6
1 1

样例输出:

57

数据范围:

总人数 K<=50。
每个背包的容量 V<=5000。
物品种类数 N<=200。
其它正整数都不超过 5000。
输入数据保证存在满足要求的方案。

 
解题思路:
读完题目,大概学过的人都知道是背包,只是具体怎么做的问题
***如果没学过背包问题的人,一定要去学学,这个是dp的基础,建议学习《背包九讲》
如果是单纯的01背包,f[j]=f[j-a[i]]+v[i]
那么这样只能计算最优解,如果要计算k优解呢?
我们可以增加一维,来记录当前状态下,即装了j的空间的时候的k优解
那么我们的转移就有点问题了,如何将f[j-a[i]]这样一个vector转化到f[j]这个vector
这里我们要提到归并排序,把两个有序数组合并的方法
***如果不会把两个有序数组合并的,也建议先去学习一下,这也是联赛的基础
那么这里便是把f[j]和f[j-a[i]]两个有序vector合并了
%:pragma GCC optimize()
#include<bits/stdc++.h>
using namespace std;
const int N=,K=;
int k,v,n,ans;
int a[N],va[N],res[K],f[N][K];
int main(){
scanf("%d%d%d",&k,&v,&n);
for (int i=;i<=n;++i)
scanf("%d%d",&a[i],&va[i]);
for (int i=;i<=v;++i)
for (int j=;j<=k+;++j)
f[i][j]=-;
f[][]=;
for (int i=;i<=n;++i)
for (int j=v;j>=a[i];--j)
if (f[j-a[i]][]!=-){
int l1=,l2=,tot=;
while (l1<=k&&l2<=k){
if (f[j][l1]==-||f[j-a[i]][l2]==-) break;
if (f[j][l1]>=f[j-a[i]][l2]+va[i])
res[++tot]=f[j][l1],l1++;
else res[++tot]=f[j-a[i]][l2]+va[i],l2++;
}
if (f[j][l1]==-)
while (l2<=k&&f[j-a[i]][l2]!=-) res[++tot]=f[j-a[i]][l2]+va[i],l2++;
else if (f[j-a[i]][l2]==-)
while (l1<=k&&f[j][l1]!=-) res[++tot]=f[j][l1],l1++;
for (int l=;l<=min(tot,k);++l) f[j][l]=res[l];
}
for (int i=;i<=k;++i)
ans+=f[v][i];
printf("%d",ans);
}

总结:这道也算是背包问题的一点拓展,当然还有更多的问题等着读者去解决

[XJOI]noip43 T2多人背包的更多相关文章

  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. 洛谷 P1858 多人背包 DP

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

  6. 洛谷 P1858 多人背包

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

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

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

  8. luogu P1858 多人背包

    嘟嘟嘟 既然让求前\(k\)优解,那么就多加一维,\(dp[j][k]\)表示体积为\(j\)的第\(k\)优解是啥(\(i\)一维已经优化掉了). 考虑原来的转移方程:dp[j] = max(dp[ ...

  9. 【洛谷P1858】多人背包

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

随机推荐

  1. jQuery顺序加载图片(初版)

    浏览器加载图片区别: IE:同时加载与渲染 其他:加载完之后再渲染 根据这个差异用jQuery做个实例:按顺序加载一组图片,加载完成后提示. <!DOCTYPE html> <htm ...

  2. 【转】linux命令

    shell实例手册 0 说明{ 手册制作: 雪松    更新日期: 2015-11-02 欢迎系统运维加入Q群: 198173206  # 加群请回答问题    欢迎运维开发加入Q群: 3655344 ...

  3. 分布式机器学习框架:CXXNet

    caffe是很优秀的dl平台.影响了后面很多相关框架.        cxxnet借鉴了很多caffe的思想.相比之下,cxxnet在实现上更加干净,例如依赖很少,通过mshadow的模板化使得gpu ...

  4. C#抽奖算法

    摘自网络 static void Main(string[] args) { //各物品的概率保存在数组里 ]{ 0.5f, 0.5f, , }; //单次测试 //Console.WriteLine ...

  5. Git 从github克隆文件至本地

    学习阶段,同一个项目,如何保障家与公司的代码同步的问题,可以使用git克隆来解决 在家将项目提交到了GitHub上,现在来到公司,需要将GitHub上的项目克隆到本地,那么对于公司的电脑来说,同样需要 ...

  6. Java语言输出HelloWorld

    1.新建一个名为HelloWorld.txt的文本文件. 2.将HelloWorld.txt改为.java. 3.将HelloWorld.java用文本文件的方式打开,并输入代码. 4.打开命令行,进 ...

  7. 文件元数据、文件夹操作(day08)

    一.获取文件的元数据(meta data) 通过read write可以对文件的内容进行读写. 但是今天我们要操作的是文件的元数据(文件的属性信息) day08$ls -l hello -rw-rw- ...

  8. 重置root管理员密码(RedHat、CentOS、Fedora)

    重启Linux系统主机并出现引导画面时,按下键盘上的e键进入内核编辑界面. 在Linux16参数这行后面追加"rd.break"参数,然后按下Ctrl+x组合键来运行修改后的内核程 ...

  9. [Cerc2007]robotic sort

    splay区间反转练手题 #include <iostream> #include <cstdio> #include <algorithm> using name ...

  10. 系统和帮助-Linux基础知识

    iOS镜像: 硬盘分区:留出一些空间;实在不成,可安装完成以后,新增一块虚拟硬盘; 终端:terminal 用户界面: GUI:图形界面 GNome KDE CLI: bash,zsh,sh,csh, ...