horoyoisawaのゴミ箱

いろいろ書きます

AtCoder Beginner Contest 015 D - 高橋君の苦悩 誤答コード(Resolved)

また自分の目が腐っているかもしれない案件について。

この問題だ。

atcoder.jp

提出コードはこちら。そしてスクリーンショットも合わせて。

atcoder.jp

f:id:horoyoisawa:20200330165942p:plain

まあ半分以上WAやし自分のプログラムが間違っとんのやろな

そしてサンプル2に対しての自分のプログラムの出力はこちら。

f:id:horoyoisawa:20200330170114p:plain

★★18★★

そして問題ページにある出力はこちら。

f:id:horoyoisawa:20200330170318p:plain

!!!!!!!18!!!!!!!!

ふう、どうやらまた視力検査が必要なみたいだぜ。。コンタクトに変えようか。

冗談抜きで皆さんも試して見てほしい。以下のプログラムに上記の入力を私見てほしい。そして結果を教えてほしい。

#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の内容をすっかり忘れていた。

つまり自分が定義していたdp[i][j][l]は「inputの左からi個までを使うことができ、実際にj個を使いかつ全ての幅がl以下であるような時の重要度の合計の最大値」だった。

つまり出力するのがdp[n][k][w]だと「inputの左からn個を使うことができ、実際にk個を使ってかつ全ての幅がw以下であるような時の重要度の合計の最大値」になってしまう。

k個使う必要はないので、その部分を修正する。結果AC。