// 提出時にassertはオフ #ifndef DEBUG #ifndef NDEBUG #define NDEBUG #endif #endif #include using namespace std; using ll = long long; #define ALL(x) (x).begin(), (x).end() template using vec = vector; int N, W; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> N >> W; vec w(N), v(N); for(int i = 0; i < N; i++){ ll cur_w, cur_v; cin >> cur_w >> cur_v; w[i] = cur_w; v[i] = cur_v; } // dp[i][j] = 品物1~iの範囲で、重さjかけて得られる最大の価値 // i側をインライン化しとく vec dp(W + 1); for(int i = 1; i <= N; i++){ vec cur_dp = dp; for(int j = 0; j < W; j++){ // 配るDP ll new_weight = j + w[i - 1]; ll new_value = dp[j] + v[i - 1]; if(new_weight <= W){ if(new_value > dp[new_weight]){ cur_dp[new_weight] = new_value; } } } swap(cur_dp, dp); } for(int i = 1; i <= W; i++){ cout << dp[W] - dp[W - i] + 1 << "\n"; } }