永发信息网

动态规划 DP 复制书稿 递归算法 代码查错

答案:1  悬赏:50  手机版
解决时间 2021-02-15 16:42
  • 提问者网友:喧嚣尘世
  • 2021-02-14 17:09
program copy;
var
a:array[1..30] of integer;
n,k:integer;

procedure input;
var
f:text;
i:integer;
begin
assign(f,'copy.in');
reset(f);
readln(f,n,k);
for i:=1 to n do
read(f,a[i]);
close(f);
end;

procedure output;
var
f:text;
i:integer;
begin
for i:=1 to n do
write(a[i]:3);
readln;
end;

function done(n,k:integer):integer;
function side1(n:integer):integer;
var
i,t:integer;
begin
t:=0;
for i:=1 to n do
if a[i]>t then t:=a[i];
side1:=t;
end;

function side2(n:integer):integer;
var
i,s:integer;
begin
s:=0;
for i:=1 to n do
inc(s,a[i]);
side2:=s;
end;

function max(a,b:integer):integer;
begin
if a>b then max:=a
else max:=b;
end;

function sigema(b,c:integer):integer;
var
i,t:integer;
begin
t:=0;
for i:=b to c do
inc(t,a[i]);
sigema:=t;
end;

function digui(n,k:integer):integer;
var
i,x,t:integer;
begin
t:=maxint;
for i:=1 to n-k+1 do
begin
x:=max(done(n-i,k-1),sigema(n-i+1,n));
if x end;
end;

begin {main done}
if n=k
then done:=side1(n)
else if k=1
then done:=side2(n)
else done:=digui(n,k);
end;

begin {main}
input;
write(done(n,k));
output;
readln;
end.

症状:
输入
10 4
4 1 4 7 4 4 5 2 1 0
(既4人复制10本书)

输出0

还有一个非常恐怖的问题:
单步执行
无论是按F7还是F8
屏幕立刻开始闪烁
2,3秒中后
DOS界面
一大堆乱七八糟的16进制代码
2,3秒中后
FP自动关闭

我已经不感在运行了

尝试着用GDB调试
我又用的不熟

麻烦大家帮忙看看
变量说明
n 书的数目
k 抄写员的数目
a 书稿页数数组

子程序说明:
input 从文件读入
output 没什么用的
done 主函数 他有三个子函数
side1 n=k时的边界条件
side2 k=1时的边界条件 有一个子函数:sigema 用于求和
digui 递归

在提出这个问题的40分钟内
我已经编出了非递归的程序了
(自己编的)
最佳答案
  • 五星知识达人网友:英雄的欲望
  • 2021-02-14 18:14
非递归的程序
const
mm=501;
var
f,t:array[0..mm,0..mm] of longint;
a,b:array[0..mm] of longint;
n,k,i,j,h,g,q,p:longint;
function max(x,y:longint):longint;
begin
if x>y then exit(x)
else exit(y);
end;
begin
read(n,k);
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
fillchar(f,sizeof(f),10);
fillchar(t,sizeof(t),0);
for i:=1 to n do begin read(a[i]); b[i]:=b[i-1]+a[i] end;
f[n+1,0]:=0;
for j:=1 to k do
for i:=n-j+1 downto 1 do
for h:=n-j+2 downto i+1 do
begin
g:=max(f[h,j-1],b[h-1]-b[i-1]);
if f[i,j]>=g then begin
f[i,j]:=g;
t[i,j]:=h;
end;
end;
p:=1;q:=t[1,k];
while q<=n do
begin
writeln(p,' ',q-1);
p:=q;
q:=t[q,k-1];
k:=k-1;
end;
writeln(p,' ',q-1);
end.
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯