time limit: 5 sec
memory limit: 64 mb
submit: 1268
solved: 887 [
submit][
status][
discuss]
貝茜在珠寶店閒逛時,買到了乙個中意的手鐲。很自然地,她想從她收集的 n(1 <= n <= 3,402)塊寶石中選出最好的那些鑲在手鐲上。對於第i塊寶石,它的重量為w_i(1 <= w_i <= 400),並且貝茜知道它在鑲上手鐲後能為自己增加的魅力值d_i(1 <= d_i <= 100)。由於貝茜只能忍受重量不超過m(1 <= m <= 12,880)的手鐲,她可能無法把所有喜歡的寶石都鑲上。 於是貝茜找到了你,告訴了你她所有寶石的屬性以及她能忍受的重量,希望你能幫她計算一下,按照最合理的方案鑲嵌寶石的話,她的魅力值最多能增加多少。
* 第1行: 2個用空格隔開的整數:n 和 m
* 第2..n+1行: 第i+1行為2個用空格隔開的整數:w_i、d_i,分別為第i塊寶石 的重量與能為貝茜增加的魅力值
* 第1行: 輸出1個整數,表示按照鑲嵌要求,貝茜最多能增加的魅力值
4 61 4
2 63 12
2 7輸入說明:
貝茜收集了4塊寶石,她能忍受重量最大為6的手鐲。
23輸出說明:
貝茜把除了第二塊寶石的其餘所有寶石都鑲上手鐲,這樣她能增加
4+12+7=23的魅力值,並且所有寶石的重量為1+2+3 <= 6,同樣符合要求。
一看就是01揹包水題,但這題糾正了我一直以來的乙個誤區
原來一直以為第二層迴圈是順序逆序都沒問題,可是幾年才明白:逆序適用於所有情況,順序只適用於每種物品只有乙個的情況
本題由題意得,只能使用倒序
var
n,m,i,j:longint;
f:array[-1..13001]of int64;
v,w:array[-1..13001]of longint;
begin
assign(input,'2871.in');
assign(output,'2871.out');
reset(input);
rewrite(output);
readln(n,m);
for i:=1 to n do
readln(v[i],w[i]);
for i:=1 to n do
for j:=m downto v[i] do//倒序
if f[j]f[j]:=f[j-v[i]]+w[i];
writeln(f[m]);
close(input);
close(output);
end.
總結:以後第二層迴圈只用倒序 1625 Usaco2007 Dec 寶石手鐲
貝茜在珠寶店閒逛時,買到了乙個中意的手鐲。很自然地,她想從她收集的 n 1 n 3,402 塊寶石中選出最好的那些鑲在手鐲上。對於第i塊寶石,它的重量為w i 1 w i 400 並且貝茜知道它在鑲上手鐲後能為自己增加的魅力值d i 1 d i 100 由於貝茜只能忍受重量不超過m 1 m 12,8...
UVa 1625 動態規劃
需要注意c i j 的遞推演算法和sp,sq,ep,eq的賦初值。由於dp i j 表示第乙個字串取i個,第二個字串取j個,所以不論dp i j 從dp i 1 j c i 1 j 來的還是從dp i j 1 c i j 1 來的,都可以在保證i 0的情況下用c i j c i 1 j 1 或0來算...
BZOJ 1625 寶石手鐲
time limit 5 sec memory limit 64 mb submit 1007 solved 684 submit status discuss 貝茜在珠寶店閒逛時,買到了乙個中意的手鐲。很自然地,她想從她收集的 n 1 n 3,402 塊寶石中選出最好的那些鑲在手鐲上。對於第i塊寶...