using
System;
public
class
GFG
{
public
static
int
minSessions(
int
[] codeTime,
int
[, ] dp,
int
ones,
int
n,
int
mask,
int
currTime,
int
WorkingSessionTime)
{
if
(currTime > WorkingSessionTime)
return
Int32.MaxValue;
if
(mask == ones)
return
1;
if
(dp[mask, currTime] != -1)
return
dp[mask, currTime];
int
ans = Int32.MaxValue;
for
(
int
i = 0; i < n; i++) {
if
((mask & (1 << i)) == 0) {
int
inc = minSessions(codeTime, dp, ones, n,
mask | (1 << i), currTime +
codeTime[i], WorkingSessionTime);
int
inc_next = 1 + minSessions(codeTime, dp,
ones, n, mask | (1 << i),
codeTime[i], WorkingSessionTime);
ans = Math.Min(ans, Math.Min(inc, inc_next));
}
}
return
dp[mask, currTime] = ans;
}
public
static
int
solve(
int
[] codeTime,
int
n,
int
WorkingSessionTime)
{
int
[, ] dp =
new
int
[(1 << 14), 15];
for
(
int
i = 0; i < 1 << 14; i++) {
for
(
int
j = 0; j < 15; j++) {
dp[i, j] = -1;
}
}
int
ones = (1 << n) - 1;
int
ans = minSessions(codeTime, dp,
ones, n, 0, 0,
WorkingSessionTime);
if
(WorkingSessionTime < 6)
{
if
(ans % 2 == 0)
ans = ans / 2;
else
ans = (ans / 2) + 1;
}
return
ans;
}
static
public
void
Main (){
int
[] codeTime = { 1, 2, 3, 1, 1, 3 };
int
n = codeTime.Length;
int
WorkingSessionTime = 4;
Console.WriteLine(solve(codeTime, n, WorkingSessionTime));
}
}