已完成今日 你真的会 01 背包吗?(https://blog.moeebius.top/index.php/archives/15/) 大学习。
给定 个整数 ,问是否存在一个子集 使得 。
直接做 ,可以除 。
找到一个最长前缀 使得 ,先把这个前缀全部选上,和为 。然后每次操作可以从 中删一个数,或加入 中一个数,使得目前集合的 。
记 表示还没考虑 和 ,目前的和为 是否可行。交换状态值域,记 表示右端点决定到 ,和为 ,左端点最大多少。
转移可以是: 右移一位,选/不选这个物品; 左移到 之间并删掉 。
复杂度 。