第1个回答 2007-06-23
动态规划关键弄清楚f【i】或f【i,j】代表什么,写好状态转移方程以及边界条件。建议你先开表,通过小的数据找出规律,在将下标套进去,就可以很快出解,我一般都是这么做的。
下面是01背包的参考程序,很短,速度也快,建议你先运行小数据,监控变量,慢慢就会搞懂的。
program bag_01;
var i,j,n,k,l,t:integer;{n-WuPin;k-Kongjian}
w,m:array[1..5001]of integer;{w-weight;m-money}
f:array[0..5001,0..5001]of integer;
function max(a,b:integer):integer;
begin
if a>b then max:=a
else max:=b;
end;
begin
readln(n,k);
for i:=1 to n do
readln(w[i],m[i]);
for i:=1 to n do{WuPin}
for j:=1 to k do{ZhongLiang}
if j>=w[i] then f[i,j]:=max(f[i-1,j],f[i-1,j-w[i]]+m[i])
else f[i,j]:=f[i-1,j];
writeln(f[n,k]);
end.
动规的经典题还有数字宝塔,最长不下降子序列,最优代价子母树,乘法问题等等,网上应该都有详细解答,我没法跟你细说
第2个回答 2007-06-22
动态规划类似于递推,但是是一个数组的递推.把每个阶段的最优解用数组记下来,再利用这个最优解推断下一个最优解,要注意的是本阶段的最优解一定只和上一个或上几个最优解有关.我们老师说,动态规划就是利用添表的方式使局部最优导致整体最优.