2016年提高组模拟题(20161114) 物品选取

来源:互联网 发布:github 网络中立 编辑:程序博客网 时间:2024/06/06 08:54

这里写图片描述

分析:
对于每种情况,都跑一次背包就好了。
代码:

const maxn=201; maxm=3001;var f:array [0..maxm] of longint; v,w,c,a,b,q:array [0..maxn] of longint; n,m,i,j,k,x,s,ans:longint;function max(x,y:longint):longint; begin  if x>y then exit(x)         else exit(y); end;begin readln(n,m); for i:=1 to n do  begin   read(q[i]);   case q[i] of    2:readln(v[i],w[i],c[i]);    3:readln(v[i],w[i]);    1:readln(a[i],b[i]);   end;  end; for i:=1 to n do  begin   if q[i]=3 then    begin     for j:=0 to m do      if j-w[i]>=0 then       f[j]:=max(f[j],f[j-w[i]]+v[i]);    end;   if q[i]=1 then    begin     for j:=m downto 0 do      for k:=0 to j do       f[j]:=max(f[j],f[j-k]+a[i]*k*k-b[i]*k);    end;   if q[i]=2 then    begin     for j:=m downto 0 do      for k:=0 to c[i] do       if j-k*w[i]>=0 then        f[j]:=max(f[j],f[j-k*w[i]]+v[i]*k);      end;  end; writeln(f[m]);end.
0 0
原创粉丝点击