01背包问题超大容量,反向思考,我可以让讨论v, 达到v这个点时,最小的w,算法就设计出来了
/*
考虑到v时的最小w
算法完成*/
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const ll V = 1e5 + 10;
const ll inf = 0x3f3f3f3f;
ll d[V + 10];
ll N, W;
ll w[110], v[110];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> N >> W;
for (int i = 1; i <= N; ++i)
cin >> w[i] >> v[i];
memset(d, inf, sizeof d);
d[0] = 0;
int maxx = 0;
for (int i = 1; i <= N; ++i)
{
for (int j = V; j >= v[i]; --j)
{
d[j] = min(d[j], d[j - v[i]] + w[i]);
if (d[j] <= W)
maxx = max(maxx, j);
}
}
cout << maxx << endl;
return 0;
}