vijos P1412多人背包 DP的前k优解】的更多相关文章

https://vijos.org/p/1412 把dp设成,dp[i][v][k]表示在前i项中,拥有v这个背包,的第k大解是什么. 那么dp[i][v][1...k]就是在dp[i - 1][v][1...k]和dp[i - 1][v - w[i]][1...k] + val[i]中合并得来. 用O(k)的算法可以找出来,因为是有序的. 注意同一个物品只能用一次. dp的初始化就有些不同. #include <cstdio> #include <cstdlib> #includ…
题目链接: https://vijos.org/p/1412 题目大意: 求01背包的前K优解,要求必须装满(1<=K<=50 0<=V<=5000 1<=N<=200) 题目思路: [动态规划] f[j][k]表示花费为j的第k优解.一开始全部赋为负值,f[0][1]=0,通过k优解转移得到新的k优解,和原来的比较后更新k优解.合并的过程用归并. // //by coolxxx ////<bits/stdc++.h> #include<iostrea…
http://acm.hdu.edu.cn/showproblem.php?pid=2639 题意:给出一行价值,一行体积,让你在v体积的范围内找出第k大的值.......(注意,不要 和它的第一题混起来,它第一行是价值,再是体积) 思路:首先dp[i][j]代表的是在体积为i的时候第j优解为dp[i][j]......那么,我们就可以这样思考,i对应体积,那么如果只是一维的dp[i],代表的应该是体积为i时的最大值,那么同理,dp[i][1]代表的是体积为i时的最大值,那么我们就可以退出两种动…
http://acm.hdu.edu.cn/showproblem.php?pid=2639 题目大意是,往背包里赛骨头,求第K优解,在普通01背包的基础上,增加一维空间,那么F[i,v,k]可以理解为前i个物品,放入容量v的背包时,第K优解的值.时间复杂度为O(NVK). Talk is cheap. 看代码吧. import java.util.Scanner; public class BoneCollector { public static void main(String[] sur…
这题和典型的01背包求最优解不同,是要求第k优解,所以,最直观的想法就是在01背包的基础上再增加一维表示第k大时的价值.具体思路见下面的参考链接,说的很详细 参考连接:http://laiba2004.blog.163.com/blog/static/8835120220138611342496/http://hi.baidu.com/chenyun00/item/1c6c44318acc8bfaa88428c7 #include <iostream> #include <cstdio&…
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 洛谷 P1858 多人背包 题目描述 求01背包前k优解的价值和 输入输出格式 输入格式 第一行三个数 $ K,V,N $ 接下来每行两个数,表示体积和价值 输出格式 前 $ k $ 优解的价值和 输入输出样例 输入样例 2 10 5 3 12 7 20 2 4 5 6 1 1 输出样例 57 说明 对于100%的数据, $ K \leq 50,V \leq…
http://acm.hdu.edu.cn/showproblem.php?pid=2639       Problem Description The title of this problem is familiar,isn't it?yeah,if you had took part in the "Rookie Cup" competition,you must have seem this title.If you haven't seen it before,it does…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639求01背包的第k大解.合并两个有序序列 选取物品i,或不选.最终的结果,是我们能在O(1)的时间内,判定对于体积j,是否应当选取第i件物品. 我们在这里作出了最优的选择.那被我们抛弃的选择呢?他很可能是次优解,第三优解,无论怎样,他都对我们本题求前K优解,起到了重要的作用! #include<stdio.h> #include<string.h> #include<algor…
/* 01背包第k优解问题 f[i][j][k] 前i个物品体积为j的第k优解 对于每次的ij状态 记下之前的两种状态 i-1 j-w[i] (选i) i-1 j (不选i) 分别k个 然后归并排序并且去重生成ij状态的前k优解 */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 1010 using namespace std; ],x[maxn],y[maxn],a,b,z; i…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639 题意:给出一行价值,一行体积,让你在v体积的范围内找出第k大的值 分析:dp[i][j][k]表示前i个物品容积为j时的第k优解.那么对于每种状态dp[i][j]都需要维护好前k优解. 每次根据前k优解进行每种取或不取第i件物品,用数组a记录取第i件物品,数组b记录不取,这样 数组a,b了所有能组成j的x种解,最后在x里取前k优解记录下来就好.剩下的肯定不是前k优解了... #include…
第\(K\)优解这类问题可在\(DP\)过程中通过添维解决.归并出当前前\(K\)大的解. #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <cmath> #define R(a,b,c) for(register int a = (b); a <= (c); ++a…
题目描述--->p1858 多人背包 分析: 很明显,这题是背包问题的一种变形. 求解 次优解or第k优解. 表示刚开始有点懵,看题解也看不太懂. 又中途去补看了一下背包九讲 然后感觉有些理解,但还是不算太清楚. 所以自己思考了一下.(应该算是大致理解了意思. 来分享一下思路. 题解里都说是裸的此类问题,并没有给出解释. (给出的解释也大多是背包九讲里的一些抽象定义 前置知识 首先根据01背包的递推式:(这里按照一维数组来讲) (v[i]代表物品i的体积,w[i]代表物品i的价值). \(f(j…
From easthong ☆背包的第k优解                 描述 Description     DD 和好朋友们要去爬山啦!他们一共有 K 个人,每个人都会背一个包.这些包的容量是相同的,都是 V.可以装进背包里的一共有 N 种物品,每种物品都有给定的体积和价值. 在 DD 看来,合理的背包安排方案是这样的: 1. 每个人背包里装的物品的总体积恰等于包的容量.  2. 每个包里的每种物品最多只有一件,但两个不同的包中可以存在相同的物品.  3. 任意两个人,他们包里的物品清单…
题目链接:https://vjudge.net/contest/103424#problem/H 题目大意:与01背包模板题类似,只不过要我们求第K个最大的总价值. 解题分析: 其基本思想是将每个状态都表示成有序队列,将状态转移方程中的max/min转化成有序队列的合并.这里仍然以01背包为例讲解一下.首 先看01背包求最优解的状态转移方程:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}.如果要求第K优解,那么 状态f[i][v]就应该是一个大小为K的数组f…
引用:http://szy961124.blog.163.com/blog/static/132346674201092775320970/ 求次优解.第K优解 对于求次优解.第K优解类的问题,如果相应的最优解问题能写出状态转移方程.用动态规划解决,那么求次优解往往可以相同的 复杂度解决,第K优解则比求最优解的复杂度上多一个系数K. 其基本思想是将每个状态都表示成有序队列,将状态转移方程中的max/min转化成有序队列的合并.这里仍然以01背包为例讲解一下. 首先看01背包求最优解的状态转移方程…
Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4824    Accepted Submission(s): 2514 Problem Description The title of this problem is familiar,isn't it?yeah,if you had took par…
Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4178    Accepted Submission(s): 2174 Problem Description The title of this problem is familiar,isn't it?yeah,if you had took pa…
解题思路:对于01背包的状态转移方程式f[v]=max(f[v],f[v-c[i]+w[i]]);其实01背包记录了每一个装法的背包值,但是在01背包中我们通常求的是最优解, 即为取的是f[v],f[v-c[i]]+w[i]中的最大值,但是现在要求第k大的值,我们就分别用两个数组保留f[v]的前k个值,f[v-c[i]]+w[i]的前k个值,再将这两个数组合并,取第k名. 即f的数组会增加一维. http://blog.csdn.net/lulipeng_cpp/article/details/…
Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7165    Accepted Submission(s): 3802 Problem Description The title of this problem is familiar,isn't it?yeah,if you had took par…
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; ][],val[],vol[], A[],B[]; int main() { int T,n,v,K,k; scanf("%d",&T); while(T--) { scanf("%d%d%…
The title of this problem is familiar,isn't it?yeah,if you had took part in the "Rookie Cup" competition,you must have seem this title.If you haven't seen it before,it doesn't matter,I will give you a link: Here is the link: http://acm.hdu.edu.c…
题意:求0/1背包的前K优解总和 k<=50 v<=5000 n<=200 思路:日常刷水 归并即可,不用排序 ; ..,..,..]of longint; w,c,a,b:..]of longint; n,m,k1,i,j,k,x,y,ans,v:longint; begin assign(input,'data.in'); reset(input); assign(output,'Tyvj1412.out'); rewrite(output); readln(k1,m,n); to…
P1858 多人背包 题目描述 求01背包前k优解的价值和 要求装满 调试日志: 初始化没有赋给 dp[0] Solution 首先补充个知识点啊, 要求装满的背包需要初始赋 \(-inf\), 边界为 \(dp[0] = 0\) 第 \(k\) 优解的01背包 以 \(dp[j][k]\) 表示 容量为 \(j\) 的背包的第 \(k\) 优解 用到了归并排序的思想 对于第 \(i\) 个物品, 容量为 \(j\), 我们有两种选择: 选第 \(i\) 个物品 不选第 \(i\) 个物品 对于…
P1858 多人背包 题目描述 求01背包前k优解的价值和 输入输出格式 输入格式: 第一行三个数\(K\).\(V\).\(N\) 接下来每行两个数,表示体积和价值 输出格式: 前k优解的价值和 说明 对于100%的数据,$ K\le 50,V\le 5000,N\le 200$ 算是积累见识吧,有些类型的题不见过一面估计比较难想 方程为\(dp[i][j][k]\)代表前\(i\)中在装了\(j\)时第\(k\)优值 如何转移呢 对\(dp[i][j]\)来说,由\(dp[i-1][j]\)…
题目大意:求解 0-1 背包前 K 优解的和. 题解:首先,可知对于状态 \(dp[j]\) 来说,能够转移到该状态的只有 \(dp[j],dp[j-w[i]]\).对于 K 优解来说,只需对状态额外增加一个维度即可.接着,考虑状态转移的过程,即:需要从 \(dp[j][1...k]\rightarrow dp[j][1...k],dp[j-w[i]][1...k]\rightarrow dp[j][1...k]\),可以考虑每次取出两堆数中的最大值进行比较,取较大的给当前状态,时间复杂度较高.…
,,,本来自以为,我dp学得还挺好的 然后今天一考发现都不会啊QAQ 连最基础的知识点都不清楚啊QAQ 所以就来写个题解嘛! 先放下板子题 其实我jio得,这题只要大概了解方法就不是很难鸭,,,毕竟是基础算法,还是比较好理解的QAQ 大概说下QwQ 就是开f[i],它是个一个长度为k的数组,表示的是重量为i时的前k优解(物品那一维显然可以滚掉不说 然后转移也很显然,就是f[i+val[j]]=max(f[i+val[j]],f[i]) 注意一下就是这里的取max是指从这k*2个数中选前k大的,彼…
洛谷题目链接:多人背包 题目描述 求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-cos…
求01背包前k优解的价值和 输入输出格式 Input/output 输入格式:第一行三个数K.V.N(k<=50,v<=5000,n<=200)接下来每行两个数,表示体积和价值输出格式:前k优解的价值和 解题思路: 这个题刚开始没做出来只能说是因为我没有认真地去看那个叫背包九讲的东西(这里附网址 http://wenku.baidu.com/view/519124da5022aaea998f0f22.html) 背包九讲中第九讲明确给出求次小值及第k小值的办法,做两个队列,b1,b2,用…
嘟嘟嘟 既然让求前\(k\)优解,那么就多加一维,\(dp[j][k]\)表示体积为\(j\)的第\(k\)优解是啥(\(i\)一维已经优化掉了). 考虑原来的转移方程:dp[j] = max(dp[j], dp[j - c[i]] + v[i]). 现在多了一维,那么dp'[j][k]就分别从dp[j][]和dp[j - c[i]][]中取前\(k\)大的即可. #include<cstdio> #include<iostream> #include<cmath> #…
题面 设$dp[i][j]$表示容量为$i$时的第$j$优解,因为是优解,肯定$dp[i][j]$是随着$j$增大不断递减的,这样的话对于一个新加进来的物品,它只可能从两个容量的转移的前$k$优解中转移过来,所以每次用两个指针扫一下转移过来就好了. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ,K=; int vol[N],val[N],tmp[K],dp[N][…