Esempio n. 1
0
int main()
{
	freopen("a", "r", stdin);
	while (scanf("%d%d%d", &N, &M, &K) != EOF)
	{
		if (N == 0 && M == 0 && K == 0) break;
		for (int i = 0; i < N; i++)
			for (int j = 0; j < K; j++)
			{
				scanf("%d", &need[i][j]);
				//printf("%dneed\n", need[i][j]);
			}
		for (int i = 0; i < M; i++)
			for (int j = 0; j < K; j++)
			{
				scanf("%d", &have[i][j]);
				//printf("%dhave\n", have[i][j]);
			}
		for (int k = 0; k < K; k++)
			for (int i = 0; i < N; i++)
				for (int j = 0; j < M; j++)
				{
					scanf("%d", &cost[k][i][j]);
					//printf("%dcost\n", cost[k][i][j]);
				}

		bool ok = true;
		for (int i = 0; i < K; i++)
		{
			int allNeed = 0, allHave = 0;
			for (int j = 0; j < N; j++)
				allNeed += need[j][i];
			for (int j = 0; j < M; j++)
				allHave += have[j][i];
			if (allNeed > allHave)
			{
				ok = false;
				printf("-1\n");
				break;
			}
		}
		if (!ok) continue;
		int ans = 0;
		for (int k = 0; k < K; k++)
		{
			int X = 0, Y = 0;
			for (int i = 0; i < N; i++)
				for (int j = 1; j <= need[i][k]; j++)
					A[X++] = i;
			for (int i = 0; i < M; i++)
				for (int j = 1; j <= have[i][k]; j++)
					B[Y++] = i;
			km.init(X, Y);
			for (int i = 0; i < X; i++)
				for (int j = 0; j < Y; j++)
				{
					km.addEdge(i, j, -cost[k][A[i]][B[j]]);
					//cout << i << " " << j << cost[k][A[i]][B[j]] << endl;
				}
			ans += -km.solve();
		}
		printf("%d\n", ans);
	}
	return 0;
}