結果
| 問題 |
No.2866 yuusaan's Knapsack
|
| コンテスト | |
| ユーザー |
Today03
|
| 提出日時 | 2024-08-30 22:15:40 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 49 ms / 2,000 ms |
| コード長 | 1,830 bytes |
| コンパイル時間 | 2,792 ms |
| コンパイル使用メモリ | 259,252 KB |
| 実行使用メモリ | 36,836 KB |
| 最終ジャッジ日時 | 2024-09-26 14:36:27 |
| 合計ジャッジ時間 | 4,348 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 26 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int INF = 1e9 + 10;
const ll INFL = 4e18;
template <typename T>
struct NegativeVector : vector<T> {
int offset;
NegativeVector(int lo, int hi, T init) {
assert(lo <= hi);
this->assign(hi - lo + 1, init);
offset = -lo;
}
T& operator[](int i) {
assert(i + offset >= 0);
return vector<T>::operator[](i + offset);
}
T operator[](int i) const {
assert(i + offset >= 0);
return vector<T>::operator[](i + offset);
}
};
#include <atcoder/modint>
using mint = atcoder::modint998244353;
int main() {
int N, M;
cin >> N >> M;
vector<ll> V(N), W(N);
for (int i = 0; i < N; i++) cin >> V[i] >> W[i];
const int mx = 10000;
const int hi = max(0, M + mx);
vector<NegativeVector<ll>> dp(N + 1, NegativeVector<ll>(-mx, hi, -INFL));
dp[0][0] = 0;
for (int i = 0; i < N; i++) {
for (int j = -mx; j <= hi; j++) {
if (dp[i][j] == -INFL) continue;
dp[i + 1][j] = max(dp[i + 1][j], dp[i][j]);
if (j + W[i] >= -mx && j + W[i] <= hi) dp[i + 1][j + W[i]] = max(dp[i + 1][j + W[i]], dp[i][j] + V[i]);
}
}
ll vmx = -INFL;
for (int i = -mx; i <= M; i++) vmx = max(vmx, dp[N][i]);
vector<NegativeVector<mint>> dp2(N + 1, NegativeVector<mint>(-mx, hi, 0));
for (int i = -mx; i <= M; i++) {
if (dp[N][i] == vmx) dp2[N][i] = 1;
}
for (int i = N - 1; i >= 0; i--) {
for (int j = -mx; j <= hi; j++) {
if (dp[i][j] == dp[i + 1][j]) dp2[i][j] += dp2[i + 1][j];
if (j + W[i] >= -mx && j + W[i] <= hi && dp[i + 1][j + W[i]] == dp[i][j] + V[i]) dp2[i][j] += dp2[i + 1][j + W[i]];
}
}
cout << vmx << ' ' << dp2[0][0].val() << endl;
}
Today03