递归

走楼梯问题…

走十阶楼梯有多少种走法?

这个问题其实有两种思路:
1.可以用排列组合,把所有的情况的都组合出来
2.可以使用递归,把问题简化 到十阶楼梯 归根到底有 从八阶 走到 十阶跟 九阶走到十阶 如果到第九阶 有X中走法 到第八阶有 Y 中走法,那么到第十阶 就有X+Y中走法 可以写成公式 F(10) = F(8)+F(9)

这样就变成了递归的模型 ,每一个递归都必须要有出口,那么这个出口在哪呢?
我们从下往上看,走1个楼梯有一种走法 2 走两个楼梯有2中走法,那么F(3)=F(1) + F(2)
如此 出口就出现了。
那么可以得到

def get_methods(n):
'''
n:楼梯个个数
'''
if n == 1:
  return 1
elif n == 2:
  return 2
else:
  return get_methods(n-1) + get_methods(n-2)
这是递归中比较简单的问题,其中还涉及到一个优化可以用备忘录法进行保存信息,然后每次递归前进行查找。第二种方法是: 自底向上,也就是递推,这里就不做介绍了。下面来说0-1背包问题

0-1背包 问题也就是 有一个体积为V的书包 有w[1,2,3,4,5] 种物品,每种物品的价格是v[1,2,3,4,5],那么如何在有限的V下使装的物品价值最大;
这个问题其实挺复杂的。我也是搞了很长时间才弄明白,但复杂一点的又是。。。不说了,这个题利用递归的思想,大事化小,小事化了。

那么咱们这么想一下,对于v[1,2,3,4,5]中任意一件物品 我们都有两种情况,要么咱们把它装下,要么咱们不带它,由此就又有了问题,

把它装下是不是咱们要的最优解,这里就有了比较,把它装上的价值跟,没有装它进行比较 max(v[i-1],j- w[i] + v[i])v[i,j]) 其实在我看到这的时候我也很蒙蔽 它的思路是一件一件物品的放。。。
f[i][v]表示前i种物品恰好放入一个容量为v的背包可以获得的最大价值。决策为第i个物品在前i-1个物品放置完毕后,是选择放还是不放,状态转移方程为:
f[i][v] = max{ f[i-1][v], f[i-1][v – Ci] +Wi }
时间复杂度为(VN) 空间复杂度为(ON)

#咱们上代码看不懂也没关系,在代码上看看,把思路缕缕
ef solve(vlist,wlist,totalWeight,totalLength):
    resArr = np.zeros((totalLength+1,totalWeight+1),dtype=np.int32)
    for i in range(1,totalLength+1):
        for j in range(1,totalWeight+1):
            if wlist[i] <= j:
                resArr[i,j] = max(resArr[i-1,j-wlist[i]]+vlist[i],resArr[i-1,j])
            else:
                resArr[i,j] = resArr[i-1,j] 
    print(resArr)
    return resArr[-1,-1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值