pascal语言,金明的预算,循环变量的条件

来源:百度知道 编辑:UC知道 时间:2024/09/26 00:27:45
var dis:array[0..60,0..3200] of longint;
cost,value:array[1..60,0..4] of longint;
n,m:integer;
f:text;
procedure init;
var i,v,p,q,j:integer;
begin
assign(f,'budget.in');
reset(f);
readln(f,n,m);
n:=n div 10;
j:=0;
fillchar(cost,sizeof(cost),0);
for i:=1 to m do
begin
readln(f,v,p,q);
v:=v div 10;
if q=0 then
begin
cost[i,1]:=v*p;
value[i,1]:=v;
end
else begin
if cost[q,2]=0 then
begin
cost[q,2]:=cost[q,1]+v*p;
value[q,2]:=value[q,1]+v
end
else begin
cost[q,3]:=cost[q,1]+v*p;
value[q,3]:=value[q,1]+v;
cost[q,4]:=cost[q,2]+v*p;
value[q,4]:=value[q,2]+v;
end;
end;
end;
close(f);
end;
procedure main;
var i,j,k:integer;
begin
fillc

首先 第一个问题 你问的是为啥子要从1枚举到M
实际上是可以只枚举主件的 只是写代码的人懒
加个判断就是了; 对于这种方法的正确性,因为在你读入的时候 就对附件进行了处理 可以看到 当q不等于0

也就是它是附件的时候 对VALUE和 COST 赋得值是关于 value[q] 和 COST[q]的 实际上就是对前面的主件的操作 与当前的i(1<=i<=m)无关 所以value[i,k]根本就没被赋值过 值为0

而在执行的时候加了句判断 value[j,k]>0 这样就自然避免了算附件的情况

其次 第二个问题 你加MAX的地方就错了 虽然结果应该是正确的,不过你多赋了很多次值 不知道你那两个点过不去是不是超时 如果是的话 把MAX放在K循环外面试试 或者干脆就输出DIS[M,N] 可以证明正确性

nicuole