USACO 3.1.2 INFLATE
http://hi.baidu.com/raulliubo/blog/item/e2323f1ff6dca2cca78669f3.html
完全背包
普通背包的写法是
for i := 1 to n do
for j := m downto 1 do
这是为了防重复,而允许重复的写法就是
for i := 1 to n do
for j := 1 to m do
OK了。。。秒杀之。
USER: BO LIU [raulliu2]
TASK: inflate
LANG: PASCAL
Compiling...
Compile: OK
Executing...
Test 1: TEST OK [0 secs]
Test 2: TEST OK [0.004 secs]
Test 3: TEST OK [0.004 secs]
Test 4: TEST OK [0.004 secs]
Test 5: TEST OK [0.008 secs]
Test 6: TEST OK [0.048 secs]
Test 7: TEST OK [0.192 secs]
Test 8: TEST OK [0.56 secs]
Test 9: TEST OK [0.94 secs]
Test 10: TEST OK [0.948 secs]
Test 11: TEST OK [0.004 secs]
Test 12: TEST OK [0.008 secs]
All tests OK.
YOUR PROGRAM ('inflate') WORKED FIRST TIME! That's fantastic
-- and a rare thing. Please accept these special automated
congratulations.
不过咱这程序的效率也不能这么差吧,难道又是RPWT?
my ugly code:
{
PROG:inflate
ID:parachutes
LANG:PASCAL
}
var
f : array[0 .. 10000] of longint;
p, t : array[1 .. 10000] of longint;
maxm, n, i, j : longint;
begin
assign(input,'inflate.in'); reset(input);
assign(output,'inflate.out'); rewrite(output);
fillchar(f, sizeof(f), 0);
readln(maxm, n);
for i := 1 to n do
readln(p[i], t[i]);
for i := 1 to n do
for j := t[i] to maxm do
if f[j] < f[j - t[i]] + p[i] then
f[j] := f[j - t[i]] + p[i];
writeln(f[maxm]);
close(input); close(output);
end.