#include int main() { int N, M; scanf("%d %d",&N,&M); double a[N+1][M+1], p[N+1][M+1]; int m[N+1][M+1]; for (int i = 0; i < N; i++) for (int j = 0; j <= M; j++) scanf("%lf ",&a[N-i][j]); // trik - obrátíme pořadí pro jednodušší vypisování for (int i = 0; i <= M; i++) p[0][i] = 1; // neexistují žádné úkoly for (int i = 1; i <= N; i++) // dynamika for (int j = 0; j <= M; j++) { int maxk = 0; // přidělíme úkolu i 0 minut for (int k = 1; k <= j; k++) // zkusíme úkolu i přidělit k=1..j minut if (a[i][k] * p[i-1][j-k] >= a[i][maxk] * p[i-1][j-maxk]) maxk = k; p[i][j] = a[i][maxk] * p[i-1][j-maxk]; // nejlepší uložíme m[i][j] = maxk; // zapamatujeme si, kolik jsme úkolu přidělili minut } int zbyva = M; for (int i = N; i > 0; i--) { printf("Úkol %d: %d minut\n",N-i+1,m[i][zbyva]); // kolik minut přidelím úkolů i, zbyva -= m[i][zbyva]; //když zbylo "zbývá" minut } printf("Celková pravděpodobnost spokojenosti: %f\n",p[N][M]); return 0; }