已完成今日 你真的会 01 背包吗?(https://blog.moeebius.top/index.php/archives/15/) 大学习。

给定 个整数 ,问是否存在一个子集 使得


直接做 ,可以除

找到一个最长前缀 使得 ,先把这个前缀全部选上,和为 。然后每次操作可以从 中删一个数,或加入 中一个数,使得目前集合的

表示还没考虑 ,目前的和为 是否可行。交换状态值域,记 表示右端点决定到 ,和为 ,左端点最大多少。

转移可以是: 右移一位,选/不选这个物品; 左移到 之间并删掉

复杂度