#include<iostream>
#include"ilcplex/ilocplex.h";

using namespace std;

int main() {

	//podaci
	int S[] = {2, 6, 7};
	int D[] = {3, 3, 4,5};
	int numS = size(S);
	int numD = size(D);

	int C[3][4] = { {20,11,15,13},{17,14,12,13},{15,12,18,18} };

	IloEnv env;

	IloModel model(env);
	//definisemo promenljive: matrica X, |S| x |D|
	IloArray<IloNumVarArray> X(env,numS);

	for (int s = 0; s < numS; s++)
	{
		X[s] = IloNumVarArray(env,numD,0,INFINITY,ILOINT);
	
	}

	//definicemo f-ju cilja
	IloExpr of(env);

	for (int s = 0; s < numS; s++)
	{
		for (int d = 0; d < numD; d++)
		{
			of += C[s][d] * X[s][d];
		}
	}
	model.add(IloMinimize(env, of));

	//definisemo ogranicenja

	for (int s = 0; s < numS; s++)
	{
		IloExpr cond1(env);
		for (int d = 0; d < numD; d++)
		{
			cond1 += X[s][d];
		}
		model.add(cond1 == S[s]);

	}

	for (int d = 0; d < numD; d++)
	{
		IloExpr cond2(env);
		for (int s = 0; s < numS; s++)
		{
			cond2 += X[s][d];
		}
		model.add(cond2 == D[d]);

	}

	IloCplex cplex(model);
	cplex.setOut(env.getNullStream());
	cplex.setError(env.getNullStream());
	cplex.solve();

	double vred_f_je_cilja = cplex.getObjValue();
	cout << "Vrednost funkcije cilja: " << vred_f_je_cilja << endl;
	cout << "Status: " << cplex.getStatus() << endl;
	cout << "Vreme: " << cplex.getTime() << endl;

	cplex.exportModel("TP.lp");




	
}