Java递归回溯

时间:2018-11-17 11:15:45

标签: java recursive-backtracking

我正在学习计算机科学,我目前正在练习回溯,因为我对此很不好。 我发现该练习是在线进行的:

您正在卖苹果。这是您苹果的当前价格表:

计数1 2 3 4 5 6 7 8 价格1 5 8 9 10 17 17 20

因此,如果您一次卖出8个苹果,您将获得20美元。 如果您卖出6,然后卖出2,您将获得22 $。 尝试找到最大的利润。 这是方法,您应该使用:

public static long sellApples(int count, long[] prices) {

}

现在我考虑了大约5个小时,但是我找不到一个好的解决方案。 有人要挑战吗?

2 个答案:

答案 0 :(得分:0)

我不是这个问题的专家,所以请听我说些盐。

在该方法中,您需要将计数分成多个部分,例如8 => 3, 5。您需要再次调用此方法,并将这两个值都设为count。那是最明显的部分。

棘手的是您需要承认将计数分为2部分就足够了。我的意思是您不需要尝试使用1,2,5值调用该方法,因为如果仅使用3,5进行调用,则下一次迭代可以将3拆分为{{1} }。

一个更明显的事实是,如果您尝试过1,2,则无需尝试3,5

因此,如果输入为8,则尝试使用5,381,72,63,5并比较结果,选择最大的一。根据您提供的方法存根,我假设您不需要返回结果的方式,只需返回最大结果本身即可。

答案 1 :(得分:-1)

希望这会对您有所帮助。

    public static long sellApples(int count, long[] prices) {
    long maxKnownValue = 0L;
    if(count==1){
        return prices[0];
    }
    for(int i=1;i<=prices.length && i<=count;i++){
        long valueCandidate = sellApples(count-i, prices)+prices[i-1];
        if(valueCandidate>maxKnownValue){
            maxKnownValue=valueCandidate;
        }
    }
    return maxKnownValue;
}