[ABC321F] #(subset sum = K) with Add and Erase
Genius_Star · · 题解
题意:
有一个箱子,每次可以向里面添加或拿走一个数,问每次操作后,任选箱子里的数加在一起,和等于
思路:
可惜赛时没开 F,真的很简单……
注意到
因为涉及到计数问题,考虑动态规划,定义
对于每次添加的数,状态转移方程为
对于每次减去的数,状态转移方程为
对于每次询问之后,输出
时间复杂度为:
完整代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=5050,mod=998244353;
ll read(){
ll x;
scanf("%lld",&x);
return x;
}
void write(ll x){
printf("%lld",x);
}
char op;
ll q,x,k;
ll dp[N];
int main(){
q=read(),k=read();
dp[0]=1;
while(q--){
cin>>op;
x=read();
if(op=='+'){
for(int i=k;i>=x;i--)
dp[i]=(dp[i]+dp[i-x])%mod;
}
else if(op=='-'){
for(int i=x;i<=k;i++)
dp[i]=(dp[i]-dp[i-x]+mod)%mod;
}
write(dp[k]);
putchar('\n');
}
return 0;
}