提出詳細
ソースコード
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
int T, i, j, k;
int N, B;
int main(){
cin >> T;
int ans[T][2];
for(i = 0; i < T; i++){ans[i][0] = -1; ans[i][1] = -1;}
// Tのループ
for(i = 0; i < T; i++){
cin >> N;
int P[N], V[N];
cin >> B;
for(j = 0; j < N; j++){
scanf("%d %d", &P[j], &V[j]);
}
// 初期化
int dp[N + 1][B + 1];
for(j = 0; j < N + 1; j++){
for(k = 0; k < B + 1; k++){
dp[j][k] = -1;
}
}
dp[0][0] = 0;
// 計算
for(j = 0; j < N; j++){
for(k = 0; k < B + 1; k++){
if(dp[j][k] >= 0){
dp[j + 1][k] = max(dp[j][k], dp[j + 1][k]);
if(k + P[j] <= B){
dp[j + 1][k + P[j]] = max(dp[j + 1][k + P[j]], dp[j][k] + V[j]);
}
}
}
}
// 勝ちの最大を確かめる
for(j = 0; j <= B; j++){
if(ans[i][1] <= dp[N][j]){
ans[i][0] = j;
ans[i][1] = dp[N][j];
}
}
}
for(i = 0; i < T; i++){
cout << "Case #" << i + 1 << ':' << endl;
cout << ans[i][0] << ' ' << ans[i][1] << endl;
}
return 0;
}
提出情報
提出出力結果
テストケース情報
# |
状態 |
詳細情報 |
正解か誤答の場合のみ表示されます. |