题目:你是一名专业强盗,计划沿着一条街打劫。每间房屋都储存有一定金额的钱,唯一能阻止你打劫的约束条件就是房屋之间有安全系统相连,如果同一个晚上有两间相邻的房屋被闯入,它们就会自动联络警察,因此不可以打劫相邻的房屋。
给出一个表示每个房子的金额的非负整数的列表,确定你今天晚上可以抢救的最大金额,而不提醒警察。
例如:给定一个整数数组a[]={-1, 2, 3, -5, 9, 4, 10},求出不相邻元素组成的子集中元素之和最大是多少。那么子集{2,9,10}的元素之和最大。
思路:rob方法是求子集最大和的方法,最终结果是max(a[i]+rob(a,i+2), rob(a,i+1)),采用递归直到i++到数组的尾部。
public static void main(String[] args) {
int[] a = {2,3,5, -2, -6,9,10,5, -10,20,30,40,35};
System.out.println(rob2(a,0));
}
static int rob2(int[] a,int i) {
if(i> a.length-1) {
return 0;
}
if(i == a.length-1) {
return max(a[a.length-1],0);
}
int include = a[i] +rob2(a, i+2);
int exclude =rob2(a, i+1);
return max(include, exclude);
}
static int max(int a,int b) {
return a>b?a:b;
}