抢劫者算法

题目:你是一名专业强盗,计划沿着一条街打劫。每间房屋都储存有一定金额的钱,唯一能阻止你打劫的约束条件就是房屋之间有安全系统相连,如果同一个晚上有两间相邻的房屋被闯入,它们就会自动联络警察,因此不可以打劫相邻的房屋。

给出一个表示每个房子的金额的非负整数的列表,确定你今天晚上可以抢救的最大金额,而不提醒警察。

例如:给定一个整数数组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;

}

你可能感兴趣的:(抢劫者算法)