#335. 采药(01背包)

采药(01背包)

采药(01背包)

题目描述

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

输入

输入的第一行有两个整数 TT(1≤T≤10001 \le T \le 1000)和 MM(1≤M≤1001 \le M \le 100),TT 代表总共能够用来采药的时间,MM 代表山洞里的草药的数目。 接下来的 MM 行每行包括两个在 11 到 100100 之间(包括 11 和 100100)的整数,分别表示采摘某株草药的时间和这株草药的价值。

输出

输出只包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。

样例输入 1

70 3
71 100
69 1
1 2

样例输出 1

3

样例输入 2

100 4
10 20
20 30
30 40
40 50

样例输出 2

140

样例解释 2

T=100T = 100 的时间刚好够把 4 株草药都采下来:10+20+30+40=10010+20+30+40 = 100,总价值 20+30+40+50=14020+30+40+50 = 140。

样例输入 3

10 3
5 10
4 9
6 12

样例输出 3

21

样例解释 3

采第 2 株(4 时间 9 价值)和第 3 株(6 时间 12 价值):时间 4+6=104+6 = 10,价值 9+12=219+12 = 21,这是最好的选择。

样例输入 4

5 3
10 100
20 200
30 300

样例输出 4

0

样例解释 4

三株草药各自都要 10、20、30 的时间,都超过 T=5T = 5,一株也采不了,所以最大总价值是 00。

思路提示

这是一道 01 背包:每一株草药都只有「采」和「不采」两种选择,而且每株最多采一次。两种常见写法:

  • 二维 DP 表方式:dp[i][j]dp[i][j] 表示「只看前 ii 株草药、并且花掉 jj 的时间」能得到的最大价值(1≤i≤M1 \le i \le M,1≤j≤T1 \le j \le T),待求解的是 dp[M][T]dp[M][T]。
  • 一维滚动数组方式:dp[j]dp[j] 表示「花掉 jj 的时间」能得到的最大价值,待求解的是 dp[T]dp[T];每株草药都让 jj 从大到小更新,这样同一株草药不会被采两次。