AtCoder Beginner Contest 015 D - 高橋君の苦悩 誤答コード(Resolved)
また自分の目が腐っているかもしれない案件について。
この問題だ。
提出コードはこちら。そしてスクリーンショットも合わせて。
そしてサンプル2に対しての自分のプログラムの出力はこちら。
そして問題ページにある出力はこちら。
ふう、どうやらまた視力検査が必要なみたいだぜ。。コンタクトに変えようか。
冗談抜きで皆さんも試して見てほしい。以下のプログラムに上記の入力を私見てほしい。そして結果を教えてほしい。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using P = pair<int, int>;
#define chmin(i, j) i = min(i, j);
#define chmax(i, j) i = max(i, j);
#define rep(i, n) for(int i=0;i<n;i++)
int main() {
int w;
cin >> w;
int n, k;
cin >> n >> k;
vector<P> input(n);
rep(i, n) cin >> input[i].first >> input[i].second;
vector<vector<vector<int>>> dp(n+1, vector<vector<int>>(k+1, vector<int>(w+1)));
rep(i, n+1) {
rep(j, k+1) {
if(j > i) break;
rep(l, w+1) {
if(i == 0 || j == 0 || l == 0) {
dp[i][j][l] == 0;
}
else if(input[i].first > l) dp[i][j][l] = dp[i-1][j][l];
else {
dp[i][j][l] = max(dp[i-1][j][l], dp[i-1][j-1][l-input[i].first] + input[i].second);
}
}
}
}
cout << dp[n][k][w] << endl;
}
では。
追記用
自分の目が腐っていた。
input[i]は違っていて、input[i-1]が正解
それに直したところWAがほとんどなくなった。(まだACしていない)。
いろいろテストケースを作っていたところ、次のテストケースで引っかかった。
3
3 2
3 100
5 500
7 200
expected: 100, output: 0
自分が実際定義していたの内容をすっかり忘れていた。
つまり自分が定義していたdp[i][j][l]は「の左から個までを使うことができ、実際に個を使いかつ全ての幅が以下であるような時の重要度の合計の最大値」だった。
つまり出力するのがdp[n][k][w]だと「の左から個を使うことができ、実際に個を使ってかつ全ての幅が以下であるような時の重要度の合計の最大値」になってしまう。
個使う必要はないので、その部分を修正する。結果AC。