洛谷 P1858 多人背包
2015-08-13 20:34
232 查看
求01背包前k优解的价值和
输入输出格式 Input/output
输入格式:
第一行三个数K、V、N(k<=50,v<=5000,n<=200)
接下来每行两个数,表示体积和价值
输出格式:
前k优解的价值和
解题思路:
这个题刚开始没做出来只能说是因为我没有认真地去看那个叫背包九讲的东西(这里附网址 http://wenku.baidu.com/view/519124da5022aaea998f0f22.html)
背包九讲中第九讲明确给出求次小值及第k小值的办法,做两个队列,b1,b2,用于储存选这个物品和不选这个物品的最大价值,然后取最大值进行合并(类似归并排序)
输入输出格式 Input/output
输入格式:
第一行三个数K、V、N(k<=50,v<=5000,n<=200)
接下来每行两个数,表示体积和价值
输出格式:
前k优解的价值和
解题思路:
这个题刚开始没做出来只能说是因为我没有认真地去看那个叫背包九讲的东西(这里附网址 http://wenku.baidu.com/view/519124da5022aaea998f0f22.html)
背包九讲中第九讲明确给出求次小值及第k小值的办法,做两个队列,b1,b2,用于储存选这个物品和不选这个物品的最大价值,然后取最大值进行合并(类似归并排序)
program ManyBag; var ans,i,j,l,q1,q2,t,k,n,v,sv,w:longint; f:Array[0..50,0..5000] of longint;//f[i,j]表示第i大的背包,在体积为j时的体积 b1,b2:array[1..50] of longint; begin read(k,sv,n); for i:=0 to sv do for j:=0 to k do f[j,i]:=-1000;//对数组赋一个极小值 f[1,0]:=0;//第1大的数值在体积为0时价值为0 for i:=1 to n do begin read(v,w); for j:=sv downto v do if f[1,j-v]>=0 then begin fillchar(b1,sizeof(b1),0); fillchar(b2,sizeof(b2),0); q1:=1; q2:=1; for l:=1 to k do begin b1[l]:=f[l,j];//不选的队列 b2[l]:=f[l,j-v]+w;//选的队列 if b1[q1]>b2[q2] then begin f[l,j]:=b1[q1]; inc(q1);//用下一个数比较 end else begin f[l,j]:=b2[q2]; inc(q2); end; end; end; end; for i:=1 to k do ans:=ans+f[i,sv]; writeln(ans); end.
相关文章推荐
- Mac下安装MacProt,并GNU autotools的安装和使用 autoconf,automake
- C++, const:
- Web AppBuilder Developer 1.2优点与缺点
- Agri-Net
- Android-应用开发-网络编程(五)
- IOS--UI--NSOperation
- HDU 5386 Cover(暴力)
- swanzhu学ios(四)之UIScrollView与UIPageControl
- Agri-Net
- [leetcod] Valid Anagram 判断颠倒字母顺序而构成的单词
- HDU 3045 MAX Average Problem
- Android学习笔记(三)
- pscp+psftp+putty的使用
- HDU 1001 整型数据处理
- html与css经典二级菜单编写2
- LeetCode120——Triangle
- uva 140 剪枝搜索
- 一般函数指针和类的成员函数指针
- android-将系统和应用程序级的屏幕亮度
- UBI介绍