主题:编程难题求解
新手菜鸟1
[专家分:0] 发布于 2009-03-21 15:56:00
帮帮小王
小王参加的考试是几门科目的试卷放在一起考,一共给T分钟做。他现在已经知道每门科目花的时间和得到的分数的关系,还有写名字要的时间(他写自己名字很慢)请帮他算一下他最高能得几分。
输入格式
第一行两个整数T,N,NAME。T是总时间,N表示总科目,NAME是写名字的时间。接下来N行,每行N个正数,第I个数表示时间为I时这门科目的分数(不一定递增)。时间为0时这门功课的分数为0,所以不输入了。
回复列表 (共8个回复)
沙发
angwuy [专家分:2280] 发布于 2009-03-21 18:44:00
貌似是背包
板凳
小田甜 [专家分:3910] 发布于 2009-03-21 19:24:00
[quote]
第一行两个整数T,N,NAME。
[/quote]
怎么想都别扭。
[quote]
接下来N行,每行N个正数
[/quote]
应该每行T(或者T-Name)个“自然数”。
[quote]
(不一定递增)
[/quote]
那么是否可以提前交卷?
这些似乎都是问题。
我除了这些也没有什么思路,只是暴力搜索+骗分。
3 楼
abcwuhang [专家分:1840] 发布于 2009-08-27 11:07:00
f[i,j]=max{f[i-1,k]+a[i,j-k]}
4 楼
tzhlryy [专家分:270] 发布于 2009-08-27 17:58:00
01背包,这有一程序:
var
n,m,i,j,t,jz:integer;
a,w,p,b:array[1..1000] of integer;
pj:array[1..1000] of real;
begin
readln(m);
readln(n);
for i:=1 to n do
begin
read(w[i]);
b[i]:=i;
end;
for i:=1 to n do
begin
read(p[i]);
pj[i]:=p[i] / w[i];
end;
for i:=n downto 1 do
for j:=n downto 1 do
if pj[i]<pj[j] then
begin
t:=p[i];
p[i]:=p[j];
p[j]:=t;
t:=w[i];
w[i]:=w[j];
w[j]:=t;
t:=b[i];
b[i]:=b[j];
b[j]:=t;
end;
i:=1;
while (m<>0) do
begin
if w[i]=0 then break;
if (m-w[i]>=0) then
begin
jz:=jz+p[i];
m:=m-w[i];
a[b[i]]:=1;
i:=i+1;
end
else
begin
a[b[i]]:=0;
i:=i+1;
end;
end;
if (w[1]=m) and (p[1]>=jz) then
begin
a[1]:=1;
for i:=2 to n do
a[i]:=0;
for i:=1 to n do
write(a[i]);
writeln;
write(jz);
end else
begin
for i:=1 to n do
write(a[i],' ');
writeln;
write(jz);
end;
end.
修改以下旧好了
5 楼
abcwuhang [专家分:1840] 发布于 2009-09-11 15:00:00
打错方程了。
应该是
f[i]=max{f[i-t[j]]+mark[j]}
6 楼
abcwuhang [专家分:1840] 发布于 2009-09-13 09:20:00
4楼的是贪心吧
MS不能过全部数据,如果数据刁钻就挂了~
是rqnoj140原题。。
我的AC程序:
program rq140;
var n,t,i,j,k:shortint;
namet,ans:longint;
a,f:array [0..10,0..100] of longint;
function max(x,y:longint):longint;
begin
if x>y then exit(x);
exit(y);
end;
begin
readln(t,n,namet);
for i:=1 to n do
a[i,0]:=0;
for i:=1 to n do
for j:=1 to t do
read(a[i,j]);
fillchar(f,sizeof(f),0);
for i:=1 to n do
for j:=1 to t do
begin
f[i,j]:=f[i-1,j];
for k:=0 to j do
if j-k-namet>=0 then
f[i,j]:=max(f[i,j],f[i-1,k]+a[i,j-k-namet])
else break;
end;
ans:=0;
for j:=0 to t do
ans:=max(ans,f[n,j]);
writeln(ans);
end.
7 楼
1042144576 [专家分:10] 发布于 2009-09-20 21:11:00
背包,DP
8 楼
chip [专家分:80] 发布于 2010-08-06 23:46:00
打错了,‘每行N个正数’因改为‘每行T个正数’。
原题说:‘对于50 %的数据,n<=4,对于100 %的数据,n<=10,t<=100, 所有数据都在longint范围内。’用搜索也可吧?
我来回复