2540. 【NOIP动态规划专题】采药2 (Standard IO)

来源:互联网 发布:淘宝中国质造入口 编辑:程序博客网 时间:2024/06/05 14:55

2540. 【NOIP动态规划专题】采药2 (StandardIO)

Description

  辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”    如果你是辰辰,你能完成这个任务吗?

Input

  输入文件的第一行包含两个正整数N,M。M表示总共能够用来采药的时间,N代表山洞里的草药的数目。接下来的N行每行包括两个的整数,分别表示采摘某株草药的时间Ti和这株草药的价值Vi。

Output

  输出文件仅包含一个整数表示规定时间内可以采到的草药的最大总价值。

Sample Input

3 9 

10 10

 8 1 

1 2

Sample Output

3

Data Constraint

50%的数据中 N,M ≤ 1000; 100%的数据中 N,M ≤ 100000,Ti,Vi ≤10。

 

本人思路

本体直接01背包就好了,保证你只有五十分。。

我就比较机智,看到Ti,Vi ≤10。就把他直接转化为有121个物品的完全背包恩恩,然后用了AJ给我们讲的二进制法转化为01背包,然后就过了。

 

程序:

<pre name="code" class="html">var  w:array[0..100,0..100]of longint; x,y:array[1..100100] of longint;  f:array[0..100010]of longint; i,j,k,l:longint; n,m:longint; nm:longint; function max(x,y:longint):longint;begin  ifx>y then exit(x)        else exit(y);end; begin readln(n,m);  fori:=1 to n do    begin     readln(j,k);     inc(w[j,k]);    end;  fori:=0 to 10 do    forj:=0 to 10 do     begin       k:=w[i,j];       l:=1;       while (k-l*2>0) do         begin           nm:=nm+1;           x[nm]:=l*i;           y[nm]:=l*j;           l:=l*2;         end;       if k<>0 then begin       nm:=nm+1;       x[nm]:=(k-l+1)*i;       y[nm]:=(k-l+1)*j;       end;     end;  fori:=1 to nm do    begin     for j:=m downto x[i] do        f[j]:=max(f[j],f[j-x[i]]+y[i]);    end;  write(f[m]);end.


1 0
原创粉丝点击