#5731. 采药人的行囊

采药人的行囊

当前没有测试数据。

题目描述

辰辰是一位采药人,他每天都要到山里采药。山里的药材种类繁多,每种药材都有其独特的价值和采集特点。

今天,辰辰的背包容积为 V,他有 n 种药材可以选择采集。但这 n 种药材的采集规则各不相同:

  • 普通药材:每种只有一株,采或不采(01背包)
  • 常见药材:数量无限,想采多少采多少(完全背包)
  • 稀有药材:每种有限定数量,最多采指定株数(多重背包)

辰辰想知道,在不超过背包容积的前提下,他最多能获得多少价值的药材?

输入格式

第一行两个整数 V 和 n,分别表示背包的容积和药材的种类数。

接下来 n 行,每行描述一种药材:

  • 第一个整数 type 表示药材类型(1=普通,2=常见,3=稀有)
  • 第二个整数 w 表示该药材占用的容积
  • 第三个整数 v 表示该药材的价值
  • 如果 type=3,第四个整数 k 表示该药材的最大采集数量

输出格式

一个整数,表示能获得的最大价值。

样例输入

10 5
1 2 3
2 3 4
3 1 2 3
1 5 10
3 2 5 2

样例输出

21

数据范围

对于 30% 的数据:V ≤ 100, n ≤ 20 对于 60% 的数据:V ≤ 1000, n ≤ 100 对于 100% 的数据:V ≤ 2000, n ≤ 500,每种药材的容积和价值均不超过 1000

提示

这是一道混合背包问题,需要综合运用三种背包的处理方式。

对于普通药材(01背包):倒序枚举容积。 对于常见药材(完全背包):正序枚举容积。 对于稀有药材(多重背包):可以用二进制优化。