求问关于数组大小
查看原帖
求问关于数组大小
1517090
DrDuck楼主2025/2/7 16:36
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, W, tot;
int w[120], v[120], g[50][10024], f[50][10024];
vector<int> ww[12000], vv[12000];
int lowbit(int x)
{
    return x & -x;
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    while (true)
    {
        for (int i = 0; i <= 100; i++)
        {
            ww[i].clear();
            vv[i].clear();
        }
        memset(g, 0, sizeof(g));
        memset(f, 0, sizeof(f));
        cin >> n >> W;
        if (n == -1)
        {
            break;
        }
        for (int i = 1; i <= n; i++)
        {
            cin >> w[i] >> v[i];
            int fo = log2(lowbit(w[i]));//1后面0的个数
            ww[fo].push_back(w[i] >> fo);//把前面的一堆0全压了
            vv[fo].push_back(v[i]);
        }
        tot = log2(W);
        for (int i = 0; i <= tot; i++)
        {
            for (int j = 0; j < ww[i].size(); j++)
            {
                for (int k = 1005; k >= ww[i][j]; k--)
                {
                    g[i][k] = max(g[i][k], g[i][k - ww[i][j]] + vv[i][j]);
                }
            }
        }
        for (int i = 0; i <= tot; i++)
        {
            for (int j = 1005; j >= 0; j--)
            {
                for (int p = 0; p <= j; p++)
                {
                    if (i == 0)
                    {
                        f[i][j] = max(g[i][p], f[i][j]);
                    }
                    f[i][j] = max(f[i][j], f[i - 1][(j - p) * 2 + ((W >> (i - 1)) & 1)] + g[i][p]);
                }
            }
        }
        cout << f[tot][1] << '\n';
    }
    return 0;
}

为什么我把这段代码中 wwvv 的大小改成 1200 就RE,而这段代码甚至 wwvv 数组都没有完全初始化(只初始化了前 100 个)就能 AC?

按理来说 log2(W)log2(W) 的值不可能超过 30 啊?为什么要开这么大才能 AC?

2025/2/7 16:36
加载中...