You are on page 1of 32

dd_engi

http://www.oiers.cn/pack/Index.html

version 1.1 build 20071115


(dd_engi)
NOIP

v1.1 2007 11 15

OI ACM-ICPC

OIBH


01

USACO
USACO Training

P01: 01

N V i c[i]
w[i]

f[i][v] i v

f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}

i
v i
i-1 i
i-1 v
f[i-1][v] i i-1
v-c[i] f[i-1][v-c[i]]
i w[i]

O(VN)
O
i=1..N
f[i][0..V]
f[0..V] i f[v]
f[i][v]f[i][v] f[i-1][v] f[i-1][v-c[i]]
f[i][v] i f[v] f[i-1][v]
f[i-1][v-c[i]] v=V..0

f[v] f[v] f[v-c[i]] f[i-1][v-c[i]]

for i=1..N
for v=V..0
f[v]=max{f[v],f[v-c[i]]+w[i]};

f[v]=max{f[v],f[v-c[i]]}
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]} f[v-c[i]]
f[i-1][v-c[i]] v
f[i][v] f[i][v-c[i]]
P02 01

01
01

ZeroOnePack 01
costweight
procedure ZeroOnePack(cost,weight)
for v=V..cost
f[v]=max{f[v],f[v-cost]+weight}

v=V..0

cost f[0..cost-1]

01
for i=1..N
ZeroOnePack(c[i],w[i]);

f[0]
0 f[1..V]- f[N]

f[0..V] 0
f

0 0 nothing
-

0 0

for v=V..1
f[v] f[v-w[n]]
j f[v-sum{w[j..n]}]

for i=1..N
for v=V..0

for i=1..n
bound=max{V-sum{w[i..n]},c[i]}
for v=V..bound

01
01

P02:

N V i
c[i] w[i]

01
0
1 2 01 f[i][v]
i v

f[i][v]=max{f[i-1][vk*c[i]]+k*w[i]|0<=k*c[i]<=v}

01 O(VN)
f[i][v] O(v/c[i])
O(V*(V/c[i]))
01
01

ij
c[i]<=c[j] w[i]>=w[j] j
j i

O(N^2)
V
O (V+N)

01
01
01 i
V/c[i] i V/c[i]
01
01

i c[i]*2^k
w[i]*2^k k c[i]*2^k<=V
i 2^k
O(log V/c[i])
O(VN)

O(VN)

for i=1..N
for v=0..V
f[v]=max{f[v],f[v-cost]+weight}

P01 v
P01 v=V..0
i f[i][v]
f[i-1][v-c[i]]
i
i f[i-1][v-c[i]]
i
i f[i][v-c[i]]
v=0..V
for

f[i][v-c[i]]

f[i][v]=max{f[i-1][v],f[i][v-c[i]]+w[i]}

procedure CompletePack(cost,weight)
for v=cost..V
f[v]=max{f[v],f[v-c[i]]+w[i]}

O(VN)

P03:

N V i n[i]
c[i] w[i]

i n[i]+1 0
1 n[i] f[i][v] i v

f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}

O(V*n[i])

01
01 i
n[i] 01 n[i] 01
O(V*n[i])
01
i
i 0..n[i]
n[i]

1,2,4,...,2^(k-1),n[i]-2^k+1 k n[i]-2^k+1>0
n[i] 13 1,2,4,6

n[i] n[i] i
0..n[i]

0..2^k-1 2^k..n[i]

i O(log n[i])
<math>O(V*log n[i]) 01
O(log amount)
amount
procedure MultiplePack(cost,weight,amount)
if cost*amount>=V
CompletePack(cost,weight)
return
integer k=1
while k<amount
ZeroOnePack(k*cost,k*weight)
amount=amount-k
k=k*2
ZeroOnePack(amount*cost,amount*weight)

O(VN)
O(VN)
O(1)
DP NOIP

O(V*n[i])
O(V*log n[i]) NOIP
O(VN)

P04:

P01P02P03
01

01
P01 P02

O(VN)
for i=1..N
if i 01
for v=V..0
f[v]=max{f[v],f[v-c[i]]+w[i]};
else if i
for v=0..V
f[v]=max{f[v],f[v-c[i]]+w[i]};

O(VN)
NOIP P03 O(log
n[i]) 01

for i=1..N
if i 01
ZeroOnePack(c[i],w[i])
else if i
CompletePack(c[i],w[i])
else if i

MultiplePack(c[i],w[i],n[i])

01

P05:

1 2 i a[i]
b[i] V U
w[i]

f[i][v][u] i
v u
f[i][v][u]=max{f[i-1][v][u],f[i-1][v-a[i]][u-b[i]]+w[i]}

v u

M
1 M
f[v][m] v m
01 f[0..V][0..M]

P11

P06:

N V i c[i]
w[i]

f[k][v] k v

f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i]| i k}

for k
for v=V..0
for i k
f[v]=max{f[v],f[v-c[i]]+w[i]}

beta
for v=V..0for i k

P02

P07

P07:

i
j i j

NOIP2006

n 2^n+1

P06

P06 P02

i 01 0..V-c[i]
f'[0..V-c[i]]
V-c[i]+1 c[i]+k
f'[k]+w[i]
01 i V-c[i]+1
P06

01

DP
DP
P08

NOIP2006

P08:

V
0..V h v
h(v)

h[0..V] v h[V]
c w 01
h(c)=w 0
v
c h(v)=v/c*w 0
n h(v)=v/c*w
v c v/c<=n 0
h 0..V v
v h(v)=0 h(v) v
P07

h l
v
0..V
v v h l f(v)
f(v)=max{h(k)+l(v-k)|0<=k<=v}

f h l 0..V
f h l

hl f
f h l
O(V^2)

s s[0..V]

v v

0..V

Scheme

NOIP OI

OIer

P09:

max min

01
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]} g[i][v]

g[i][v]=0 f[i][v]
f[i][v]=f[i-1][v]g[i][v]
i i
f[N][V]
i=N
v=V
while(i>0)
if(g[i][v]==0)
print " i "
else if(g[i][v]==1)
print " i "
v=v-c[i]


f[i][v] g
g[i][v]==0 f[i][v]==f[i-1][v]g[i][v]==1 f[i][v]==f[i-1][v-c[i]]+w[i]

1..N
01

1 1
v-c[1] 2..N 1
V 2..N
i..N 1..i

N 1 f[i][v]==f[i-1][i-v]
f[i][v]==f[i-1][f-c[i]]+w[i] i

max
sum
f[i][v]=sum{f[i-1][v],f[i][v-c[i]]}

f[0][0]=1


01

f[i][v]g[i][v]
f[i][v] g[i][v]
for i=1..N
for v=0..V
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
g[i][v]=0
if(f[i][v]==f[i-1][v])
inc(g[i][v],g[i-1][v])
if(f[i][v]==f[i-1][v-c[i]]+w[i])
inc(g[i][v],g[i-1][v-c[i]])

K
K

K K

max/min 01
01
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]} K
f[i][v] K f[i][v][1..K] f[i][v][k]
i v k f[i][v] K
C
f[i][v][1..K] K

f[i][v] f[i-1][v]
f[i-1][v-c[i]]+w[i] f[i-1][v]
f[i-1][v][1..K]f[i-1][v-c[i]]+w[i] f[i-1][v-c[i]][1..K]
w[i] K

f[i][v][1..K] O(K) f[N][V][K]


O(VNK)

K
K max

NOIP
OIer

USACO
USACO USA Computing Olympiad

USACO Trainng

(TEXT Knapsack Problems)


USACO Contest USACO
NOIP
USACO Training
NOIP

Inflate (+) 01
Stamps (+)(!)
Money
Nuggets
Subsets
Rockers (+)
Milk4 (!) DP

USACO
DD USACO
Inflate 01

f[k][i] = max{f[k-1][i] ,
f[k-1][i-v[k]]+w[k]}f[k][i] k i
v[k] w[k] k f[k]
k f[k-1]
f[i] k

f[i] f[i-v[k]]+w[k]

stamps

f[k][i] k i
f[k][i]= min{f[k-1][i],f[k-1][i-j*s[k]]+j} j
k

Money

min sum
Nuggets
ij
xy i*x+y*j=n n>i*j
Subsets N
N*(N+1)/4 01
Rockers
f[i][j][t]=max{f[i][j][t-1] , f[i-1][j][t] , f[i-1][j][t-time[i]]+1 ,
f[i-1][j-1][T]+(t>=time[i])} f[i][j][t] i j
t T
t>=time[i] bool int 0 1
f[i][j]=(a,b)
i j a b

Milk4
DP
DP USACO
AC DP
f[k] k
f
i pre_f[i] pre_v[i]
i pre_f[i] pre_v[i]
i


f
USACO

P11:

01

01 O(2^N)
2^N
procedure SearchPack(i,cur_v,cur_w)
if(i>N)
if(cur_w>best)
best=cur_w
return
if(cur_v+v[i]<=V)
SearchPack(i+1,cur_v+v[i],cur_w+w[i])
SearchPack(i+1,cur_v,cur_w)

cur_v cur_w
SearchPack(1,0,0)

NP-Complete 01
S X S
X
O(2^(N/2))
N S
S S1 S2
N/2 S1 S2 2^(N/2)
hash set
X S
S1 X1 S2 X-X1

hash set O(1)


O(2^(N/2))

N=42

DP?


DP V O(VN)
N V V
N

DP

http://kontactr.com/user/tianyi/

OI

OIBH

jason911
donglixp
LeafDuo

XiaQ beta

sfita P01

Emacs
EmacsMuse

Copyright (c) 2007 Tianyi Cui


Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License,
Version 1.2 or any later version published by the Free Software
Foundation.

You might also like