有人可以指导我在做什么错吗?我在过去的4-5天里进行了很多研究,每个人都在指向子集问题或分区问题,对于简单性原因,我只给出了行为不正确的部分。
for (Iterator<Activity> iterator = listOfActivities.iterator(); iterator.hasNext();) {
Activity currentAct = iterator.next();
if (time + currentAct.getTime() <= 180) {
timetable.add(currentAct);
time += currentAct.getTime();
iterator.remove(); //removing the current activity once its added to the schedule.
}
}
time += 60;
timetable.add(new Activity("Eat Food 20min", "20"));
// Post Lunch Activities Start here:
for (Iterator<Activity> iterator = listOfActivities.iterator(); iterator.hasNext();) {
Activity currentAct = iterator.next();
if (time + currentAct.getTime() >= 240 && time + currentAct.getTime() <= 480) {
timetable.add(currentAct);
time += currentAct.getTime();
iterator.remove();
}
}
答案 0 :(得分:0)
如果我理解正确,您需要找到总和最多为180的数字的子集,然后将相应的活动添加到午餐前列表中,其余的则添加到午餐后的列表中。
由于在这种情况下检索相应的活动不是问题,您可能需要查看this post,其中描述的算法应该适合您的问题。
这是一种基本的数值方法,可以尝试所有可能的组合,然后检查它们中哪些匹配所需的总和。
答案 1 :(得分:0)
考虑这个输入:60, 60, 45, 30, 30
您的算法从开始迭代并添加适合的项目,因此它将添加60
(120个剩余),然后60
(60个仍为),然后45
(15个仍然存在) )。现在它显然无法填补剩余的15分钟,并且完全会错过添加30
和30
而不是45
的选项。
您所描述的确实是子集和问题的实例,它是NP-complete problem。这基本上意味着(在这里简化很多),你通常必须尝试所有可能性 - 没有直接的方法来达到解决方案。
你的代码现在实际上做的是它只尝试了几个解决方案,但是错过了很多。要以一种简单的方式解决这个问题,你必须(一旦你完成所有输入并且未能完全填充180),删除最后添加的输入并尝试不使用它等。但是学习会更好并实现如子集所述的子集和问题的动态规划解决方案在维基百科上。