Submission #01543
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include <bits/stdc++.h> using namespace std; int main() { int t, n; int m[1001], p[1001]; int dp[1001][1001]; //dp[i][j]:iを読んだとき(読まないときもある),勉強時間がjのときの最大点数 // t:勉強できる限界の時間 n:本の数 cin >> t >> n; // m[i]:i番目の本を読むのにかかる時間 p[i]:i番目の本を読むことで取れる点数 for ( int i=1; i<=n; i++) { cin >> m[i] >> p[i]; } //-1で初期化(-1はこの問題においてありえない値だから) for ( int i=0; i<=n; i++) { for ( int j=0; j<=t; j++) { dp[i][j] = -1; } } //自明な解を入れておく dp[0][0] = 0; //dpする for ( int i=1; i<=n; i++) { for ( int j=0; j<=t; j++) { // dp[i-1][j]に値があったら(-1でやっても意味ない & 時間の無駄) if ( dp[i-1][j] >= 0 ) { // ↓はi番目の本を読まずに、とりあえずdp[i-1][j]の値をいれてるって意味 dp[i][j] = dp[i-1][j]; // 現在の合計勉強時間に、i番目の本の勉強時間を足した値がt以下だったら if ( t >= j + m[i] ) { // dp[i][j]にi番目の本の点数を足した値の方が大きかったらいれる。 // すでにそれより大きい値が入っていたらいれない。 dp[i][j + m[i]] = max(dp[i-1][j + m[i]], dp[i][j] + p[i]); } } } } // dpテーブル確認用 /*for(int i=0; i<=n; i++) { for(int j=0; j<=t; j++) { printf("%3d", dp[i][j]); } cout << endl; }*/ //最大を求める(dp[n][0] ~ dp[n][t]までの中で最大の値が答え) int ans = 0; for ( int i=0; i<=t; i++) { ans = max(ans, dp[n][i]); } cout << ans << endl; } |
ステータス
項目 | データ |
---|---|
問題 | 0170 - テスト勉強 |
ユーザー名 | ei1430 |
投稿日時 | 2015-10-31 13:31:10 |
言語 | C++11 |
状態 | Accepted |
得点 | 10 |
ソースコード長 | 1792 Byte |
最大実行時間 | 21 ms |
最大メモリ使用量 | 4516 KB |
セット
セット | 得点 | Cases | |
---|---|---|---|
1 | ALL | 10 / 10 | * |
テストケース
ファイル名 | 状態 | 実行時間 | メモリ使用量 | # |
---|---|---|---|---|
in1.txt | AC | 21 ms | 476 KB |
1
|
in2.txt | AC | 10 ms | 956 KB |
1
|
in3.txt | AC | 12 ms | 780 KB |
1
|
in4.txt | AC | 14 ms | 628 KB |
1
|
in5.txt | AC | 15 ms | 600 KB |
1
|
in6.txt | AC | 11 ms | 2884 KB |
1
|
in7.txt | AC | 10 ms | 944 KB |
1
|
in8.txt | AC | 14 ms | 1280 KB |
1
|
in9.txt | AC | 16 ms | 4432 KB |
1
|
in10.txt | AC | 13 ms | 4516 KB |
1
|