求助!Pascal题目

来源:百度知道 编辑:UC知道 时间:2024/06/01 23:43:45
老师布置了几道题目,以下题目请高手帮忙!

1.简单的背包问题。设有一个背包,可以防如入的重量为s。现有n件物品,重量分别为w1,w2,w3,……,wn均为正整数。从n件物品中挑选若干件,使得放入背包的重量之和正好为s.

2.从键盘输入N个数,用递归的方法实现找到N个数的最大数及该数在N个数中的位置。

小弟感激不尽哦,希望各位大虾帮忙~

第一题用深度优先搜索,可以用递归的方式完成。先按重量对n个物品排序。

Function good(r:integer;set1:set of integer;ss:integer):boolean;
var bool:boolean;
begin
bool:=true;
if r in set1 then bool:=false;{如果已经加入过了就为假。}
if ss+w[r]>s then bool:=false;{如果装不下就为假}
good:=bool;
end;

Procedure try(dep:integer;set1:set of integer;ss:integer;);
var r:integer;
begin
for r:=1 to n do
if good(r,set1,ss)then
begin
a[dep]:=r;{记下加入包的物品的编号}
if ss+w[r]<s then try(dep+1,set1+r,ss+w[r]);{没有加满就继续加}
else print(dep);{加满了就打印}
end;
a[dep]:=0;
end;
其中a中存入物品编号。w数组存入重量。set为已经加入背包的物品序号。ss为已经加入背包的总总量。
第二题我从不用递归做一个循环就搞定。

max:=-32767;{擂台数初始化}
flag:=0;{位置标志初始化}
for i:=1 to n do
if max<=a[i] then{如果现在看到的数字比已经找到的最大数大}
begin
flag:=i;{记下现在数字的下标即位置}
max:=a[i];{记下现在的数字}
end;
这样max中就是最大数。flag就是最大数在数