首页 > 其他分享 >AtCoder ABC321F - #(subset sum = K) with Add and Erase 题解 可撤销背包

AtCoder ABC321F - #(subset sum = K) with Add and Erase 题解 可撤销背包

时间:2024-11-25 10:11:10浏览次数:6  
标签:subset AtCoder 背包 int 题解 long 撤销 op

题目链接:https://atcoder.jp/contests/abc321/tasks/abc321_f

题目大意:

给定大小为 \(k\) 的背包和 \(q\) 次操作,支持两种操作:

  • 插入一个大小为 \(x\) 的元素;
  • 删除一个大小为 \(x\) 的元素。

每次操作后,求装满背包方案数。

解题思路:

可撤销背包。

  • 插入 \(x\) 时,for i = K -> x 执行 f[i] += f[i-x]
  • 删除 \(x\) 时,for i = x -> K 执行 f[i] -= f[i-x]

(虽然我代码里是用 V 表示背包容量的)

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 5050;
const long long mod = 998244353;

int q, V, x;
char op[2];
long long f[maxn] = { 1 };

int main() {
    scanf("%d%d", &q, &V);
    while (q--) {
        scanf("%s%d", op, &x);
        if (op[0] == '+') {
            for (int i = V; i >= x; i--)
                f[i] = (f[i] + f[i-x]) % mod;
        }
        else {
            for (int i = x; i <= V; i++)
                f[i] = (f[i] - f[i-x] + mod) % mod;
        }
        printf("%lld\n", f[V]);
    }
    return 0;
}

参考资料:可撤销背包学习笔记 作者:Nicrobot

标签:subset,AtCoder,背包,int,题解,long,撤销,op
From: https://www.cnblogs.com/quanjun/p/18567056

相关文章

  • 题解 - Game on Sum (Easy Version)
    题目,还是不挂洛谷。Alice镇楼题目大意Alice和Bob又在玩游戏。该种游戏共分为\(n\)轮,每轮中,先有一个数\(x=0\),Alice将选择\(t\isin[0,t_{max}]\),而B将会选择将\(x\)增加或减少\(t\)。在全部\(n\)轮中,B应至少有\(m\)次选择减少操作。Alice希望结......
  • 【题解】洛谷P11311、P2943: 漫长的小纸带、Cleaning Up G
    赛时不会去想dp,感觉没法转移,然后去写了贪心,然后直接假掉唐完了。为什么贪心不能做,因为多个数的话还是可能被减,\(3\)个数长度为\(11\)就可以变成\(9\),非常划算,好像很显然,但是为什么我赛时写了只会有长度\(2\)的区间唐完了。考虑dp,设\(f_i\)表示\(1-i\)的最小代价,枚举......
  • CF2038A - Bonus Project 题解
    题目传送门https://codeforces.com/contest/2038/problem/A先大致捋一下题目的含义一共有n个工程师,每个工程师完成相应的工作都有一定的奖金a,但同时也会消耗成本b,目前一共有k个工作需要做这些工程师对他们的同事很友好,他们能接受自己的总收益为0来增长经验,但不能接受自己为负......
  • 题解:[P11311 漫长的小纸带]
    P11311漫长的小纸带题意:有一个长度\(n\)的序列\(a\),将\(a\)分成若干段,使得所有段价值和最小,定义价值为一段内元素数量的平方。思路:显然能用动态规划来计算答案,设\(f[i]\)表示到第\(i\)个位置所获得的最小价值,考虑怎么转移。最直接的就是从\(1\)到\(i-1\)枚举断......
  • Toyota Programming Contest 2024#11(AtCoder Beginner Contest 379)
    A-Cyclic链接:A-Cyclic代码:#include<bits/stdc++.h>usingnamespacestd;intmain(){ stringss; cin>>ss; cout<<ss[1]<<ss[2]<<ss[0]<<""<<ss[2]<<ss[0]<<ss[1]; return0;}B-Strawberri......
  • 读数据质量管理:数据可靠性与数据质量问题解决之道10数据平台
    1.      数据平台1.1.        让你能够从摄取数据到分析数据的整个过程中全面管理数据的技术组合1.2.        数据平台的要求随着业务的变化而变化1.3.        数据栈分为6层1.3.1.          数据摄取1.3.1.1.     ......
  • 读数据质量管理:数据可靠性与数据质量问题解决之道09数据可靠性
    1.      数据可靠性1.1.        数据可靠性指的是一个组织在整个数据生命周期中提供高数据可用性和健康状况的能力1.1.1.          是高数据质量带来的结果1.1.1.1.           高质量的大数据是这个大规模转型平台的核心1.1.2. ......
  • 2018 ICPC南京区域赛题解 更新至 8 题
    2018ICPC南京区域赛题解更新至8题The2018ACM-ICPCAsiaNanjingRegionalProgrammingContest目录2018ICPC南京区域赛题解更新至8题The2018ACM-ICPCAsiaNanjingRegionalProgrammingContestPrefaceProblemA.AdrienandAustinProblemD.CountryMeowProblem......
  • 题解:[ARC188C] Honest or Liar or Confused
    乍一看以为是3-SAT不可做,动动脑子发现是2-SAT(鉴于本题解书写时洛谷题面暂无中文翻译,为避免可能的歧义或困惑,先对本题解中的译法进行约定:英文题面中“honestvillager”或日文题面中“正直者”译为“诚实村民”。英文题面中“liar”或日文题面中“嘘つき”译为“撒谎村民”......
  • CF1328题解
    CF1328A简单题,我们用\(b-a%b\)的余数即可,注意特判\(a%b==0\)即可CF1328B细节蛮多的,我们可以发现最终个数可以写成\(1+2+3+\dots+(p-1)+p+g\)最后\(n-p\)就是第一个b的位置,\(n-g\)就是第二个b的位置,可以推式子然后\(O(n)\)求但是我选择二分查找g,然后注意一下细节......