识别背包问题的特征
一系列物品有属性a和属性b两种属性,在满足【一部分】物品的【属性a的和】不大于范围A的情况下,使得【属性b的和】【尽可能大】
解题方法:建立二维数组f,用两层for循环。其中二维数组的横坐标表示【一个物品】,纵坐标表示范围A,f[i][j]表示前i件物品中,在范围[0 ~ j]能取得属性b的和的最大值。
案例一:2. 01背包问题
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
分析:“一系列物品”指的是这里的“物品”,“属性a”指“物品体积”,“属性b”指“物品的价格”。横坐标表示“每个物品”,纵坐标表示“总体积”。
案例二:AcWing 423. 采药
输入文件的第一行有两个整数 T 和 M,用一个空格隔开,T 代表总共能够用来采药的时间,M 代表山洞里的草药的数目。
接下来的 M 行每行包括两个在 1 到 100 之间(包括 1 和 100)的整数,分别表示采摘某株草药的时间和这株草药的价值。
分析:一系列物品指草药,属性a指草药的时间,属性b值草药的价值。横坐标表示每株草药,纵坐标表示草药的总时间。f[i][j]表示前i株草药,时间在j内的最大总价值。