回 帖 发 新 帖 刷新版面

主题:编程难题求解

帮帮小王
小王参加的考试是几门科目的试卷放在一起考,一共给T分钟做。他现在已经知道每门科目花的时间和得到的分数的关系,还有写名字要的时间(他写自己名字很慢)请帮他算一下他最高能得几分。
输入格式
第一行两个整数T,N,NAME。T是总时间,N表示总科目,NAME是写名字的时间。接下来N行,每行N个正数,第I个数表示时间为I时这门科目的分数(不一定递增)。时间为0时这门功课的分数为0,所以不输入了。

回复列表 (共8个回复)

沙发

貌似是背包

板凳

[quote]
第一行两个整数T,N,NAME。
[/quote]
怎么想都别扭。
[quote]
接下来N行,每行N个正数
[/quote]
应该每行T(或者T-Name)个“自然数”。
[quote]
(不一定递增)
[/quote]
那么是否可以提前交卷?

这些似乎都是问题。

我除了这些也没有什么思路,只是暴力搜索+骗分。

3 楼

f[i,j]=max{f[i-1,k]+a[i,j-k]}

4 楼

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 楼

打错方程了。
应该是
f[i]=max{f[i-t[j]]+mark[j]}

6 楼

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 楼

背包,DP

8 楼

打错了,‘每行N个正数’因改为‘每行T个正数’。
原题说:‘对于50 %的数据,n<=4,对于100 %的数据,n<=10,t<=100, 所有数据都在longint范围内。’用搜索也可吧?

我来回复

您尚未登录,请登录后再回复。点此登录或注册