【Nov 8 P4,多重背包】宝物筛选
【题目描述】
终于,破解了千年的难题。小FF 找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎。但是这里的宝物实在是太多了,小FF 的采集车似乎装不下那么多宝物。看来小FF 只能含泪舍弃其中的一部分宝物了……小FF 对洞穴里的宝物进行了整理,他发现每样宝物都有一件或者多件。他粗略估算了下每样宝物的价值,之后开始了宝物筛选工作:小FF 有一个最大载重为W 的采集车, 洞穴里总共有n 种宝物的,每种宝物的价值为v [i], 重量为w[i], 每种宝物有m[i]件。小FF 希望在采集车不超载的前提下,选择一些宝物装进采集车,使得它们的价值和最大。
【输入格式】
第一行为2 整数N 和W,分别表示宝物种数和采集车的最大载重。
接下来n 行每行三个整数, 其中第i 行第一个数表示第i 类品价值, 第二个整数表示一件该类物品的重量, 第三个整数为该类物品数量。
【输出格式】
输出仅一个整数ans, 表示在采集车不超载的情况下收集的宝物的最大价值。
【输入样例】
4 20
3 9 3
5 9 1
9 4 2
8 1 3
【输出样例】
47
【数据范围】
对于30%的数据: n <= Σm[i] <= 10^4; 0 <= W <=10^3.
对于100%的数据: n <= Σm[i] <=10^5; 0<= W <=4 * 10^4;
1 <= n <= 100.
没什么好说的,就是多重背包。详细介绍请看背包九讲,找到了一个写得比较清楚的链接:http://www.cnblogs.com/asuran/archive/2009/10/12/1581667.html
参考代码:
program treasure; var n,va:longint; i,j,k:longint; v,w:array[1..100,-1..20]of longint; t:array[0..100]of longint; f:array[0..100005]of longint; procedure transform(x:integer); var i,p,num:integer; begin i:=1; p:=1; num:=t[x]; while num>=p do //分装物品 begin inc(v[x,0]); v[x,v[x,0]]:=p*v[x,-1]; w[x,v[x,0]]:=p*w[x,-1]; num:=num-p; p:=p*2; end; if num>0 then begin inc(v[x,0]); v[x,v[x,0]]:=num*v[x,-1]; w[x,v[x,0]]:=num*w[x,-1]; end; end; begin readln(n,va); for i:=1 to n do readln(w[i,-1],v[i,-1],t[i]); for i:=1 to n do transform(i); for i:=1 to n do //01背包 for j:=1 to v[i,0] do for k:=va downto v[i,j] do if f[k]<f[k-v[i,j]]+w[i,j] then f[k]:=f[k-v[i,j]]+w[i,j]; writeln(f[va]); end.
本文地址:http://www.cnblogs.com/saltless/archive/2010/11/10/1873235.html
(saltless原创,转载请注明出处)