一、问题描述:
给定一些系统备用件的单价Ck,以及当用Mk个此备用件时部件的正常工作概率Pk(Mk),总费用上限C。求系统可能的最高可靠性。
二、算法分析
1.证明这个问题符合最优化原理。可以用反证法证明之。假设用money的资金购买了前I项备用件,得到了最高的系统可靠性,而且又存在如下情况:对于备用件I,设要买Ki个,则可用的资金还剩余money – Ci*Ki,用这些钱购买前(I-1)项备用件,如果存在一种前(I-1)种备用件的购买方案得到的系统可靠性比当前得到的要高,那么这个新的方案会使得整个前I项备用件组成的系统可靠性比原先的更高,与原假设矛盾。所以可以证明这个问题符合最优化原理。
2.证明这个问题符合无后效性原则。
3.综上所述,本题适合于用动态规划求解。
4.递推方程及边界条件:
F[I,money] := max { F[I-1,money – C[I]*K[I] ] } (0<=K[I]<= C div Ci )
三、参考程序
{$Q-,R-,S-}
{$M 16384,0,655360}
Program system_dependability;
const finp='input.txt';
fout='output.txt';
maxm=3000;
var f,p:array[0..maxm] of real;
max,v:double;
c,co,e,i,j,k,m,n:integer;
procedure print;
var output:text;
begin
assign(output,fout); rewrite(output);
writeln(f[c]:1:4);
close(output);
end;
Begin
assign(input,finp); reset(input);
readln(input,n,c);
for i:=0 to c do f[i]:=1;
for i:=1 to n do begin
read(input,co); m:=c div co;
for e:=0 to m do read(input,p[e]);
for j:=c downto 0 do begin
m:=j div co; max:=0;
for k:=0 to m do begin
v:=f[j-k*co]*p[k];
if v>max then max:=v;
end;
f[j]:=max;
end;
end;
close(input);
End.