【01背包】是时候说了
题目:是时候说了 rqnoj279
题目描述
你已经忍耐太久了。现在是时候把你对大家的看法说出来了。
假设你对n个人说出自己的看法,在和第i个人说完后,你的健康指数将减少lostHealth[i],而你的快乐指数将增加gainJoy[i]。你可以和每一个人最多说一次,并且你不必按照特定顺序进行。
你的目标是得到尽可能多的快乐。最初的时候,你的健康指数为100,而快乐指数为0。如果你的健康指数为0或负数,即使你得到再多快乐,你也只会痛苦地死去。
现在编写程序请你计算出你可以得到的最大快乐指数。
输入格式
输入共3行。
第1行,1个正整数n,表示有n个人。(1<=n<=20)
第2行,n个整数,第i个整数表示你对第i个人说话会失去的健康指数lostHealth[i]。(0<=lostHealth[i]<=100)
第3行,n个整数,第i个整数表示你对第i个人说话会得到的快乐指数gainJoy[i]。(0<= gainJoy[i]<=100)
输出格式
输出共1行,1个整数,表示你可以得到的最大快乐指数。
样例输入
样例输出
01背包吧,不过注意平时背包体积(即本题的生命值)可以为0,但是此题必须>0,所以逆序枚举时只能到lost[i]+1
Pascal Code
program rqnoj279;
var
  n:longint;
  lost,get:array[0..20+10] of longint;
  f:array[0..100+10] of longint;
procedure init;
begin
  assign(input,'rqnoj279.in');
  assign(output,'rqnoj279.out');
  reset(input);
  rewrite(output);
end;
procedure outit;
begin
  close(input);
  close(output);
  halt;
end;
procedure readdata;
var
  i:longint;
begin
  read(n);
  for i:=1 to n do read(lost[i]);
  for i:=1 to n do read(get[i]);
end;
procedure main;
var
  i,j:longint;
begin
  for i:=1 to n do
    for j:=100 downto lost[i]+1 do//生命值不能为0,所以必须j-lost[i]>0,即j>=lost[i]+1
      if f[j]<f[j-lost[i]]+get[i] then
        f[j]:=f[j-lost[i]]+get[i];
  writeln(f[100]);
end;
begin
  init;
  readdata;
  main;
  outit;
end.

    ..... 转载请注明出处 ..... http://oijzh.cnblogs.com ..... by jiangzh
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号