結果
問題 | No.2866 yuusaan's Knapsack |
ユーザー |
![]() |
提出日時 | 2024-09-02 18:45:38 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 436 ms / 2,000 ms |
コード長 | 1,214 bytes |
コンパイル時間 | 5,651 ms |
コンパイル使用メモリ | 319,772 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-09-26 14:39:24 |
合計ジャッジ時間 | 12,585 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
#include <bits/stdc++.h>#include <atcoder/all>using namespace std;using lint = long long;using mint = atcoder::modint998244353;lint INF = 2000000000;int main() {int n;lint W;cin >> n >> W;vector<lint> v(n), w(n);for (int i = 0; i < n; i++) {cin >> v[i] >> w[i];}map<lint, pair<lint, mint>> dp, ndp;dp[0] = {0, 1};for (int i = 0; i < n; i++) {ndp = dp;for (auto [j, p] : dp) {if (!dp.count(j + w[i])) {ndp[j + w[i]] = {-INF, 0};}}for (auto [j, p] : dp) {if (ndp[j + w[i]].first < dp[j].first + v[i]) {ndp[j + w[i]] = {dp[j].first + v[i], dp[j].second};} else if (ndp[j + w[i]].first == dp[j].first + v[i]) {ndp[j + w[i]].second += dp[j].second;}}swap(dp, ndp);}lint val = -INF;for (auto [x, p] : dp) {if (x <= W) {val = max(val, dp[x].first);}}mint ans = 0;for (auto [x, p] : dp) {if (x <= W && dp[x].first == val) {ans += dp[x].second;}}cout << val << " " << ans.val() << endl;}