#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;
}
为什么我把这段代码中 ww
和 vv
的大小改成 1200 就RE,而这段代码甚至 ww
和 vv
数组都没有完全初始化(只初始化了前 100 个)就能 AC?
按理来说 log2(W) 的值不可能超过 30 啊?为什么要开这么大才能 AC?