: 個目までのお菓子のなかで、合計が グラムのお菓子から摂取できるカロリーの最大値
という DP が直感的に思い浮かびますが、今回の問題ではお菓子の重量がとても大きいため、この DP では解くのに時間がかかってしまいます。
: 個目までのお菓子のなかで、 カロリーを摂取するための重さの最小値
という DP をすることによってこの問題を十分高速に解くことができます。
#include <bits/stdc++.h>
using namespace std;
const long long INF = 0x1fffffffffffffff;
int main(){
int n, k;
cin >> n >> k;
vector<int> a(n), b(n);
for(int i = 0; i < n; i++){
cin >> a[i];
}
for(int i = 0; i < n; i++){
cin >> b[i];
}
vector<vector<long long>> dp(n+1, vector<long long>(101010, INF));
dp[0][0] = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j <= 100000; j++){
dp[i+1][j] = min(dp[i+1][j], dp[i][j]);
dp[i+1][j+b[i]] = min(dp[i+1][j+b[i]], dp[i][j] + a[i]);
}
}
int ans = 0;
for(int i = 0; i <= 100000; i++){
if(dp[n][i] <= k){
ans = max(ans, i);
}
}
cout << ans << endl;
}