题目描述
现在员工定义如下:
int happy;
List next;
公司的所有人都符合员工的描述,现在要开派对,如果一个员工被邀请参加派对,那他的所有直接下属都不能参加,现在,请求出如何邀请才能使派对的总快乐值最大?求出该快乐值。
思路分析
一个员工,如果被邀请,那么他的所有直接下属,都不能被邀请。如果他不被邀请,那么,他的直接下属可以被邀请,也可以不被邀请。因此,分析此题的场景,可以发现,此题可以分出两种情况,被邀请和不被邀请,因此,此题可以考虑写两个递归函数互相嵌套使用。
递归函数一:被邀请
那么,函数体应该是,它自身的happy值,加上递归调用他的所有直接下属的不被邀请函数,他被邀请,他的所有下属都不能被邀请。
递归函数二:不被邀请
函数体应该是,不加上他自身的happy值,同时,他的所有下属,既可以被邀请,也可以不被邀请,那么,就取两种情况的返回值较大的。
代码
class Employee{
int happy;
List<Employee> nest;
public Employee(int happy){
this.happy=happy;
nest=new ArrayList<>();
}
}
public static int getMostHappy(Employee e){
int mostHappy=Math.max(hasX(e),noHasX(e));
return mostHappy;
}
public static int hasX(Employee e){
if(e.nest.isEmpty()){
return e.happy;
}
int res=0;
for (Employee employee : e.nest){
res+=noHasX(employee);
}
res+=e.happy;
return res;
}
public static int noHasX(Employee e){
if(e.nest.isEmpty()){
return 0;
}
int res=0;
for (Employee employee : e.nest){
res+=Math.max(noHasX(employee),hasX(employee));
}
return res;
}