pascal 高手帮忙看看这程序,我看不懂啊

来源:百度知道 编辑:UC知道 时间:2024/06/08 07:44:42
庆功会(party)
[问题描述]
八(1)班由于在期中考中获得了团体第一名,班主任吴老师决定开一场庆功会。于是购买东西的任务就交给了小李同学(钱由班会出)。由于小李同学四肢发达,头脑简单,于是这个任务便落到了你头上(当然不要你跑腿。跑腿是小李的事 ^_^)。

[输入格式]
第一行二个数n(n<=500),m(m<=5000),其中n代表希望购买的物品的种数,m表示班会拨给小李的钱数。
接下来n行,每行3个数,v、w、s,分别表示第I种物品的价格、价值(价格与价值是不同的概念)和购买的数量(只能买0件或s件),其中v<=100,w<=1000,s<=10。

[输出格式]
一个数,表示此次购买能获得的最大的价值(注意!不是价格)。

[输入样例]
5 1000
80 20 4
40 50 9
30 50 7
40 30 6
20 20 1

[输出样例]
1000

program cs;
var
n,m:longint;
v,w,s:array[0..500] of longint;
f:array[0..500,0..5000] of longint;
i,j:longint;
function fun(n,m:longint):longint;
var
i,j:longint;
temp,tempi:longint;
begin
if n=1 then
begin
if m-v[n]*s[n]>=0 then
begin
fun:=w[n]*s[n];
end else begin fun:=0; end;
end

典型背包问题:
看一下这个:
var f:array[0..5001,1..2]of longint;//记录路径
dp:array[0..5001]of longint;//背包数组
b:array[0..5001]of boolean;//判断是否可放
n,m,v,w,s,i,j,max,id:longint;
procedure outnum(k:longint);
begin
if k=0 then exit;
outnum(f[k,1]);
if k=id then writeln(f[k,2])
else write(f[k,2],' ');
end;
begin
fillchar(b,sizeof(b),#0); //数组初始化
b[0]:=true;
readln(n,m);
for i:=1 to n do //背包过程
begin
readln(v,w,s);
if v*s>m then continue;
for j:=m downto 0 do
if (b[j])and(v*s+j<=m) then
if dp[v*s+j]<dp[j]+w*s then
begin
dp[v*s+j]:=dp[j]+w*s;
b[v*s+j]:=true;
f[v*s+j,1]:=j; //记录
f[v*s+j,2]:=i; //记录
end;
end;
for i:=m downto 1 do //找最大值
if max<dp[i] then
begin
max:=dp[i];
id:=i;