1、背包问题九讲和源程序答案 01 USACO USACO Training P01: 01NViciwifivivfiv=maxfi-1v,fi-1v-ci+wiivii-1ii-1vfi-1vii-1v-cifi-1v-ciiwiO(N*V)O(V)i=1.Nfi0.Vf0.Vifvfivfivfi-1vfi-1v-cifivifvfi-1vfi-1v-civ=V.0fvfvfv-cifi-1v-cifor i=1.N for v=V.0 fv=maxfv,fv-ci+wi;fv=maxfv,fv-cifiv=maxfi-1v,fi-1v-cifv-cifi-1v-civfivfiv-ciP0
2、2010101ZeroOnePack01costweightprocedure ZeroOnePack(cost,weight) for v=V.cost fv=maxfv,fv-cost+weightv=V.0costf0.cost-101for i=1.N ZeroOnePack(ci,wi);f00f1.V-fNf0.V0f00nothing-000101 P02: NViciwi0101201fivivfiv=maxfi-1v-k*ci+k*wi|0=k*ci=v01O(N*V)fivO(v/ci)O(VN)0101ijci=wjjjiO(N2)VO(V+N)010101iV/ciiV
3、/ci0101ici*2kwi*2kkci*2k=Vi2kO(log(V/ci)O(VN)O(VN)for i=1.N for v=0.V fv=maxfv,fv-cost+weightP01vP01v=V.0ifivfi-1v-ciiifi-1v-ciiifiv-civ=0.Vfiv=maxfi-1v,fiv-ci+wiprocedure CompletePack(cost,weight) for v=cost.V fv=maxfv,fv-ci+wiO(VN) P03: NViniciwiini+101nifivivfiv=maxfi-1v-k*ci+k*wi|0=k0ni131,2,4,6ninii0.ni0.2k-12k.niiO(log ni)O(V*log ni)01O(log amount)amountprocedure MultiplePack(cost,weight,amount) if cost*amount=V CompletePack(cost,weight) return integer k=1 while knum ZeroOnePack(k*cost,k*weight) amount=amount-k k=k*2 ZeroOnePack(amount*cost,amount*weight)O(VN)O(VN)O(1)DPNOIP