任务是这样。课程11a每周应教授35个小时(6天,无周日)。在一天中,他们必须教6个小时(最多)。
“ Matematika”每周-4小时,“ Fizika” -4小时,“ Rusi”-2小时,“ Anglisi” -2小时,“ Naqsha” -2小时, “ Biologiya” -2小时,“ Himiya” -2小时,“ Botanika” -2小时,“ Adabiyot” -3小时, “ Zabon-3小时”,“ Huquq” -3小时,“ TXT” -2小时,“ TDQ” -4。
我创建了这样的课程:
class Class
{
public string Name { get; set; }
public Dictionary<string,int> Subjects { get; set; }
public int MaxHoursInDay { get; set; }
public int MaxHoursInWeek { get; set; }
}
然后我填写了数据:
Class _class = new Class();
_class.Name = "11 a";
_class.MaxHoursInDay = 5;
_class.MaxHoursInWeek = 35;
_class.Subjects = new Dictionary<string, int>();
_class.Subjects.Add("Matematika", 4);
_class.Subjects.Add("Fizika", 4);
_class.Subjects.Add("Rusi", 2);
...
现在,我想生成所有可能的计划选项。有解决问题的公式或算法吗?
答案 0 :(得分:0)
这不是最快也是最干净的方法,但这是该过程的基本逻辑。
List
的所有课程及其小时数投入。ClassDay
存储在另一个List
中(非常重要),开始一个新的ClassDay
并保持一次又一次地使用相同的逻辑进行添加(最多5个小时),直到您将所有课程都置于最长5个小时的ClassDay
中。ClassDay
。对于单个排列,您没有6 ClassDay
以外的任何东西,这种组合不好。只有正好为6 ClassDay
的用户才是有效组合。如果可以将班级划分为不同的小时段,例如2小时可以得到2乘以1小时,则需要将所有班级拆分为尽可能小的段。然后,您将需要最后一道通行证,以按顺序合并一天中的所有课程,因此,如果3 x 1小时Matematika彼此跟随,则会将它们重新分组为3小时中的1小时。