发布网友 发布时间:2022-05-03 01:45
共1个回答
热心网友 时间:2022-06-29 05:29
fillchar (h,sizeof(h),0); fillchar (w,sizeof(w),0); for i←n downto 1 do {枚举每一个阶段的状态} begin h[i]←1;w[i]←i; {设导弹i被拦截} for j←i+1 to n do {枚举决策,计算最佳方案中拦截的下一枚导弹} if (导弹j高度≤导弹i高度)and(h[j]+1>h[i]) then begin {若导弹i之后拦截导弹j为最佳方案,则记下} h[i]←h[j]+1;w[i]←j; end;{then} if h[i]>best {调整一套系统能拦截的最多导数} then begin best←h[i];one←i;end;{then} end;{for} 输出当前系统拦截的最多导弹系数best; 1、 按照求解途径给出当前系统拦截的导弹序列 我们在计算拦截最多导弹数的过程中,利用记忆表w和one来确定拦截的最佳方式。每一项w[i]记录了拦截导弹i之后应拦截哪一枚导弹可取得h[i],而最佳方案中拦截的第一枚导弹为one。由此可知,最佳拦截次序应为one→w[one]→w[w[one]]→‥i(i=w[i])。从导弹one出发,按照w表的指引,依次输出当前系统拦截的导弹序列: while one≠w[one]do begin 输出导弹one被拦截;one←w[one]; end;{while} 输出导弹one被拦截;