400200 - 01背包

时间限制

20 毫秒

内存限制

64 MB

通过次数

12

提交次数

19

01背包是一类经典的DP问题,其特点是每种物品只有一个,只考虑选还是不选。这类问题解决的思路是计算每种背包容量,从而推得结果。考虑一个物品的时候,分两种情况:能放下和放不下,当能放下时要考虑是否放当前物品——放当前物品价值不一定更大(要知道i-1个物品只是固定了个数但不是固定了组合);当然放不下的时候就简单了——和i-1个物品时获得的价值相同。

有一个总容量为v的背包,有n个物品,每个物品的重量分别是w_i,价值分别是c_i,问,最多能装入价值多少的物品。

输入

第一行,有单个空格分隔的的两个整数,分别表示vn

接下来n行,每行有单个空格分隔的两个整数,分别表示一个物品的重量w_i和价值c_i

对于100%的数据:

1\le v \le 1000

1\le n,w_i,c_i \le 100

输出

一行,一个整数,表示能装的最大价值。

样例

输入

3 3
1 1
1 2
1 3

输出

6

输入

2 3
1 1
1 2
2 3

输出

3

输入

4 3
1 1
1 2
2 3
3 4

输出

6

提示

这类问题的思考方式是:按照背包容量从1-v进行考虑,所以也可以用递归的形式进行解答,其参数为当前物品编号和当前背包大小。如果要提高效率,避免重复搜索,可以用一个数组(二维)记录中间结果。