レストラン(ダイナミックプランニング)

2445 ワード

あるレストランにはnつのテーブルがあり、各テーブルにはパラメータがあります.aが収容できる最大人数です.mロットのお客様がいて、各ロットのお客様には2つのパラメータがあります:bは人数で、cは消費金額を予想します.相席が許可されていない場合は、アルゴリズムを実装して一部のお客様を選択し、総予想消費金額が最大になるようにしてください.
入力にはm+2行が含まれます.
1行目の2つの整数n(1<=n<=50000)、m(1<=m<=50000)
第2の動作n個のパラメータa、すなわち、各テーブルに収容可能な最大人数は、32ビットintの範囲内でスペースで区切られる.
次にm行、各行に2つのパラメータb,cを示す.第i陣の客の人数と予想消費金額をそれぞれ表し、スペースで区切られ、範囲は32位の範囲内である.
最大の総予想消費金額を示す整数を出力
入力例:
3 5
2 4 2
1 3
3 5 
3 7

1 10
入力:
20
import java.util.*;

public class Main

{
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNextInt()) {
			int m = sc.nextInt();
			int n = sc.nextInt();
			int[] c = new int[m];
			int[] w = new int[n];
			for (int i = 0; i < m; i++) {
				c[i] = sc.nextInt();
			}
			int[] v = new int[n];

			for (int i = 0; i < n; i++) {
				w[i] = sc.nextInt();
				v[i] = sc.nextInt();
			}

			int[][] b = new int[n][m];
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < m; j++) {
					if (w[i] < c[j]) {
						b[i][j] = v[i];
					} else {
						b[i][j] = 0;
					}
				}
			}
			/*
			 * int[][] b = {{3,3,3}, {0,5,0}, {0,7,0}, {0,0,0}, {10,10,10}};
			 */

			int row = b.length;
			int column = b[0].length;
			int[][] result = new int[row][column];
			Set set = new HashSet();
			ArrayList> list = new ArrayList>();
			for (int i = 0; i < row; i++) {
				list.add(new HashSet());
			}
			int[][] flag = new int[row][column];
			for (int i = 0; i < row; i++) {
				result[i][0] = b[i][0];
				list.get(i).add(i);
				flag[i][0] = i;
			}
			for (int t = 1; t < column; t++) {
				for (int j = 0; j < row; j++) {
					int max = 0;
					int maxflag = 0;
					for (int i = 0; i < row; i++) {
						if (result[j][t - 1] + b[i][t] >= max && !list.get(j).contains(i)) {
							max = result[j][t - 1] + b[i][t];
							maxflag = i;
						}
					}
					flag[j][t] = maxflag;
					result[j][t] = max;
					list.get(j).add(maxflag);
				}
			}
			int rs = 0;
			int k = 0;
			for (int i = 0; i < row; i++) {
				if (result[i][column - 1] > rs) {
					rs = result[i][column - 1];
					k = i;
				}
			}
			System.out.println(rs);
			for (int i = 0; i < column; i++) {
				System.out.print(flag[k][i] + "-->");

			}
		}
	}