我正在学习计算机科学,我目前正在练习回溯,因为我对此很不好。 我发现该练习是在线进行的:
您正在卖苹果。这是您苹果的当前价格表:
计数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个小时,但是我找不到一个好的解决方案。 有人要挑战吗?
答案 0 :(得分:0)
我不是这个问题的专家,所以请听我说些盐。
在该方法中,您需要将计数分成多个部分,例如8 => 3, 5
。您需要再次调用此方法,并将这两个值都设为count
。那是最明显的部分。
棘手的是您需要承认将计数分为2部分就足够了。我的意思是您不需要尝试使用1,2,5
值调用该方法,因为如果仅使用3,5
进行调用,则下一次迭代可以将3
拆分为{{1} }。
一个更明显的事实是,如果您尝试过1,2
,则无需尝试3,5
。
因此,如果输入为8,则尝试使用5,3
,8
,1,7
,2,6
,3,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;
}