using
System;
public
class
ChapterScheduler {
private
static
readonly
int
CHAPTERS = 4;
private
static
readonly
int
DAYS = 3;
private
static
readonly
int
NOLINK = -1;
private
static
readonly
int
[] optimal_path =
new
int
[DAYS + 1];
private
static
readonly
int
[][] DAG =
new
int
[CHAPTERS + 1][];
static
ChapterScheduler(){
for
(
int
i = 0; i <= CHAPTERS; i++) {
DAG[i] =
new
int
[CHAPTERS + 1];
}
}
private
static
void
updateAssignment(
int
[] path,
int
path_len) {
for
(
int
i = 0; i < path_len; i++) {
optimal_path[i] = path[i] + 1;
}
}
private
static
void
assignChapters(
int
u,
int
[] path,
int
path_len,
int
sum,
int
k){
int
min =
int
.MaxValue;
if
(k < 0)
return
;
path[path_len] = u;
path_len++;
if
(k == 0 && u == CHAPTERS) {
if
(sum < min) {
updateAssignment(path, path_len);
}
}
for
(
int
v = u + 1; v <= CHAPTERS; v++) {
sum += DAG[u][v];
assignChapters(v, path, path_len, sum, k - 1);
sum -= DAG[u][v];
}
}
public
static
void
minAssignment(
int
[] pages){
int
avg_pages = 0, sum = 0;
int
[] S =
new
int
[CHAPTERS + 1];
int
[] path =
new
int
[DAYS + 1];
S[0] = 0;
for
(
int
i = 0; i < CHAPTERS; i++) {
sum += pages[i];
S[i + 1] = sum;
}
avg_pages = (
int
)Math.Round((
double
)sum / DAYS);
for
(
int
i = 0; i <= CHAPTERS; i++) {
for
(
int
j = 0; j <= CHAPTERS; j++) {
if
(j <= i) {
DAG[i][j] = NOLINK;
}
else
{
sum = Math.Abs(avg_pages
- (S[j] - S[i]));
DAG[i][j] = sum;
}
}
}
assignChapters(0, path, 0, 0, DAYS);
Console.WriteLine(
"Optimal Chapter Assignment :"
);
int
ch = 1;
for
(
int
i = 0; i < DAYS; i++) {
Console.Write(
"Day"
+ (i + 1) +
": "
);
int
sumPages = 0;
while
(ch <= CHAPTERS
&& (sumPages + pages[ch - 1])
<= avg_pages * (i + 1)) {
sumPages += pages[ch - 1];
Console.Write(ch +
" "
);
ch++;
}
Console.WriteLine();
}
}
public
static
void
Main(){
int
[] pages = { 7, 5, 6, 12 };
minAssignment(pages);
}
}