F - Max Sum Counting(下标集合:max(ai)>=sum(bi)的集合个数&暴力&01背包)

题目

  1. F - Max Sum Counting
  2. 题意:求满足在这里插入图片描述的集合S的个数,S为非空下标集合
    1. 输入与限制
      在这里插入图片描述
  3. 提示:对A进行排序,然后枚举i防止重复的基本操作),得到前面的数能组成0~A[i]-B[i]的总个数(背包)。
    1. 另外注意数据范围,保证了能暴力!!!
  4. 代码
#include <bits/stdc++.h>
// #define ll long long
#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() {
    
    
    // dbg(M);
    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);
    // for (int i = 1; i <= n; i++)
    // cout << ">>>" << s[i].a << " " << s[i].b << endl;
    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;
}

猜你喜欢

转载自blog.csdn.net/I_have_a_world/article/details/119991652