题目
- F - Max Sum Counting
- 题意:求满足的集合S的个数,S为非空下标集合
- 输入与限制:
- 提示:对A进行排序,然后枚举
i
(防止重复的基本操作),得到前面的数能组成0~A[i]-B[i]
的总个数(背包)。
- 另外注意数据范围,保证了能暴力!!!
- 代码:
#include <bits/stdc++.h>
#define dbg(x) cout << #x << "===" << x << endl
using namespace std;
const int N = 5e3 + 10;
const int mod = 998244353;
int n;
struct node {
int a, b;
bool operator<(const node b) const { return a < b.a; }
} s[N];
int dp[N], ans = 0;
signed main() {
cin >> n;
for (int i = 1; i <= n; i++) scanf("%d", &s[i].a);
for (int i = 1; i <= n; i++) scanf("%d", &s[i].b);
sort(s + 1, s + 1 + n);
dp[0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= s[i].a - s[i].b; j++) ans = (ans + dp[j]) % mod;
for (int j = 5000; j >= s[i].b; j--)
dp[j] = (dp[j] + dp[j - s[i].b]) % mod;
}
cout << ans << endl;
return 0;
}