#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10, M = 3e4 + 10;
int f[N][M]; //前i个物品获得j个金币奖励花费的最少时间
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int n, m;
cin >> n >> m;
vector<int> a(n + 1), b(n + 1);
for(int i = 1; i <= n; i ++ ) cin >> a[i];
int sum = 0;
for(int i = 1; i <= n; i ++ ) cin >> b[i], sum += b[i];
memset(f, 0x3f, sizeof f);
for(int i = 0; i <= n; i ++ ) f[i][0] = 0;
for(int i = 1; i <= n; i ++ )
{
for(int j = 1; j <= sum; j ++ )
{
f[i][j] = f[i - 1][j];
if(j >= b[i])
{
f[i][j] = min(f[i][j], f[i - 1][j - b[i]] + a[i]);
}
}
}
int ans = 0;
for(int i = 1; i <= sum; i ++ )
{
if(f[n][i] <= m) ans = i;
}
cout << ans << endl;
return 0;
}
空间优化版:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10, M = 3e4 + 10;
int f[M]; //前i个物品获得j个金币奖励花费的最少时间
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int n, m;
cin >> n >> m;
vector<int> a(n + 1), b(n + 1);
for(int i = 1; i <= n; i ++ ) cin >> a[i];
int sum = 0;
for(int i = 1; i <= n; i ++ ) cin >> b[i], sum += b[i];
memset(f, 0x3f, sizeof f);
f[0] = 0;
for(int i = 1; i <= n; i ++ )
for(int j = sum; j >= b[i]; j -- )
f[j] = min(f[j], f[j - b[i]] + a[i]);
int ans = 0;
for(int i = 1; i <= sum; i ++ ) if(f[i] <= m) ans = i;
cout << ans << endl;
return 0;
}