约翰遭受了重大的损失:蟑螂吃掉了他所有的干草,留下一群饥饿的牛.他乘着容量为C(1≤C≤50000)个单位的马车,去顿因家买一些干草. 顿因有H(1≤H≤5000)包干草,每一包都有它的体积Vi(l≤Vi≤C).约翰只能整包购买,
他最多可以运回多少体积的干草呢?
这是我的第一篇博文,也标志着OI之路的新起点
嗯,加油!
银组题,老师说没事多耍耍
一看题目背包,不说了,用01
uses math;
var
c,h,i,j,a:longint;
f:array[-1..50001]of longint;//f[x]代表背包体积为x时,背包能装的最大体积
begin
readln(c,h);
for i:=1 to h do
begin
readln(a);
for j:=c downto a do//一般的,不可写作 for j:=a to c do,此题除外
f[j]:=max(f[j],f[j-a]+a);//方程,如果用if语句会稍快
end;
writeln(f[c]);
end.
1、动规一般两层循环:第一层一般为枚举物品(或物品重量、体积等);第二层一般为枚举剩余的价格(此题将体积与价格融为一体);
2、一般会有一个f数组,用f[x]来表示体积(或其他)为x时,最大价格(或效益)为f[x];
3、状态转移方程最基本为: f[i]:=max(f[i],f[i-当前枚举价格]),当然一般会更复杂;
4、最好用if语句,这样会比max稍快一些;