1.输出股票的买卖时机,使利润最大,当然可能存在多种方案,只要输出一种即可
这是需要缓存F数组,F[i] =max,则是i天卖出,然后去找之前买入时机就可以了
func maxProfit(prices []int) []int {
// 输出买卖时机
// [0,0]:表示没有交易,[1,3]:表示第1天买入,第3天卖出
n :=len(prices)
if n < 2{
return []int{0,0}
}
f :=make([]int,n)
min := prices[0]
for i:=1;i<n;i++{
f[i] = prices[i] - min
if f[i] < f[i-1] {
f[i] = f[i-1]
}
if min > prices[i]{
min = prices[i]
}
}
// 最大值是哪天获取的
f_max,idx :=0,0
for i:=0;i<n;i++{
if f_max < f[i]{
f_max= f[i]
idx = i
}
}
// 哪天买入的,idx前面的最小值
min_idx, min :=0,prices[0]
for i:=1;i<idx;i++{
if min > prices[i]{
min = prices[i]
min_idx = i
}
}
return []int{min_idx,idx}
}
2、同理,输出0-1背包问题的方案,也是有了F[i][j]二维数组,判断F[i][j] = max(F[i-1][j],F[i-1][j-v[i]] + w[i]),也是逆推的,比如F[3][10] = F[4][10],就说明物品4不在方案中
背包问题,求路径时,上图很好的体现了其决策网络及其层次
3、背包问题模板很固定,有两个主要步骤,降维和二分类。
比如根据选取数量将其分为1,2,3...n等,然后在选取k个物品时,将包含A和不包含A分为两类。