主题:[讨论]这个该怎么做呀?"选题"
wangmin0920
[专家分:0] 发布于 2007-11-03 17:26:00
文体描述:大学里执行学分制,第门课程都有一定的学分,有些课程还有“先修课程”。学生修完一个课程就能获得相应的学分。学生入学时选定自己的课程,第一个学生可选课程数目是给定的,现请你找出一个方案,使你得的学分最多。
输入:第一行两个数m,n分别表示选课程总数和学生可选课程总数 1<=m<100,1<=n<=m
以下有m行表示课程,课程号依次为1,2,……,m。第行两个整数,第一个表示“先修课程号”,没有用0表示,第二个表示该课程的学分。
输出:一个整数,最大学分数。
谢谢哪位高手解答一下,十分感谢/最好有源程序
回复列表 (共2个回复)
沙发
angwuy [专家分:2280] 发布于 2007-11-03 17:55:00
DP
板凳
abcwuhang [专家分:1840] 发布于 2007-11-05 14:50:00
program classes;
var class:array [0..100] of longint;
i,j,bh,judge:longint;
begin
readln(m,n);
fillchar(class,sizeof(class),0);
for i:=1 to m do
begin
readln(bh,judge);
class[i]:=class[bh]+judge;
end;
for i:=1 to m-1 do
for j:=i+1 to m do
if class[i]<class[j] then
begin
judge:=class[i];
class[i]:=class[j];
class[j]:=judge;
end;
judge:=0;
for i:=1 to n do
judge:=judge+class[i];
writeln(judge);
end.
{需注意的是:
输入:第i行所用的"先修课程"只能在第1到i-1行中....}
{若想修改不足可先对输入数据按所用的"先修课程"从小到大排序.在做..}
我来回复