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.


 

posted @ 2009-01-04 12:26  jesonpeng  阅读(134)  评论(0编辑  收藏  举报