Problem:
C : 壺 / Pots

問題文

ここに N 個の不思議な形の壺がある． i 番目の壺は K_i 個の直円柱を下から順に鉛直に繋げた形状である． 繋がっている順番は変えることができない． A 氏は体積 M の水を持っている． この水をそれぞれの壺に好きな量ずつに分けて注ぐ． 水が全く入っていない壺が存在しても構わない． また，全ての壺が水で満たされたとき，それ以上水を注ぐ事はできない．それぞれの壺の水面の高さの総和の最大値を求めよ．

入力

N \ M
K_1 \ S_{11} \ H_{11} \ … \ S_{1 K_1} \ H_{1 K_1}
K_2 \ S_{21} \ H_{21} \ … \ S_{2 K_2} \ H_{2 K_2}
…
K_N \ S_{N1} \ H_{N1} \ … \ S_{N K_N} \ H_{N K_N}

1 行目に N, M が， 1+i 行目には i 番目の壺の情報が入力される． K_i は直円柱の数であり，S_{ij}, H_{ij} はそれぞれ壺を構成する下から j 番目の直円柱の底面積と高さである．

制約

整数である

1 ≤ N ≤ 200

1 ≤ M ≤ 200

1 ≤ K_i ≤ 20

1 ≤ S_{ij} ≤ 20

1 ≤ H_{ij} ≤ 20

出力

答えを 1 行で出力せよ． 0.00001 以下の絶対誤差を含んでも良い．

サンプル

サンプル入力1

2 15
2 3 3 7 2
2 7 1 1 4

サンプル出力1

6.33333333

サンプル入力2

2 14
1 2 4
2 5 2 1 4

サンプル出力2

6

サンプル 1, 2 の入出力を図示すると次のようになる．

サンプル入力3

2 25
4 8 9 1 9 6 5 2 8
4 1 7 4 4 1 6 4 3

サンプル出力3

13

Solution in JAVA (judge verdict: Runtime Error)


import java.util.*;
  
public class Main {
    Scanner sc = new Scanner(System.in);
  
    public static void main(String[] args) {
        new Main(); 
    }
  
    public Main() {
        new C().doIt();
    }
    class C{
    	double map[][];
    	double DP[][];
        void doIt(){
        	int n = sc.nextInt();
        	int m = sc.nextInt();
        	map = new double[n][401];
        	DP = new double[n][401];
        	for(int i = 0;i < n;i++){
        		int s = sc.nextInt();
        		double Hsum = 0;
        		double start = 1;
        		for(int j = 0;j < s;j++){
        			double S = sc.nextDouble();
        			double H = sc.nextDouble();
        			Hsum = Hsum + (H*S);
        			for(int k = (int)start;k <= Hsum;k++){
        				map[i][k] = map[i][k-1] + (1.0/S);
        			}
        			start = Hsum + 1;
        		}
        	}
        	for(int i = 1;i <= 400;i++){
        		DP[0][i] = map[0][i];
        		if(DP[0][i] == 0)DP[0][i] = DP[0][i-1];
        	}
        	for(int i = 1;i < n;i++){
        		for(int j = 1;j <= 400;j++){
        			for(int k = 0;k <= j;k++){
        				DP[i][j] = Math.max(DP[i][j],DP[i-1][j-k]+map[i][k]);
        			}
        		}
        	}
//        	for(int i = 0;i < n;i++){
//        		for(int j = 0;j <= 15;j++){
//        			System.out.printf("%.3f ",DP[i][j]);
//        		}
//        		System.out.println();
//        	}
//        	System.out.println();
//        	for(int i = 0;i < n;i++){
//        		for(int j = 0;j <= 15;j++){
//        			System.out.printf("%.3f ",map[i][j]);
//        		}
//        		System.out.println();
//        	}
        	System.out.println(DP[n-1][m]);
        }
    }
}