【问题标题】:Identifying the houses robbed in the maximize profits puzzle在利润最大化难题中识别被盗的房屋
【发布时间】:2018-02-10 03:15:32
【问题描述】:

我正在尝试“聪明的小偷”问题,我们有一个相邻房屋价值的列表,目的是最大化利润。一个限制是,一旦房子被抢劫,它左边或右边的房子就不能被抢劫。我已经设法通过以下代码找出了战利品的最大值:

def max_theft(house_val, n):
    if n == 0:
        return 0
    if n == 1:
        return house_val[0]
    if n == 2:
        return max(house_val[0], house_val[1])


    max_theft_val = [0]*n


    max_theft_val[0] = house_val[0]
    max_theft_val[1] = max(house_val[0], house_val[1])


    for i in range(2, n):
        max_theft_val[i] = max(house_val[i]+max_theft_val[i-2],   max_theft_val[i-1])

    return max_theft_val

但是,问题的下一部分将是确定哪些房屋可以弥补这一总和。有没有办法解决这个问题?

【问题讨论】:

    标签: python dynamic-programming


    【解决方案1】:

    这是一种方法。注意何时选择了房屋并将其添加到列表中。如果下一个选择的房子前面少于两个房子,则替换列表中的最后一个房子;否则,添加它。

    JavaScript 代码(抱歉,在智能手机上,但这应该很容易适应):

    function max_theft(house_val, n){
      if (n == 0)
        return 0
      if (n == 1)
        return house_val[0]
      if (n == 2)
        return Math.max(house_val[0], house_val[1])
    
      let max_theft_val = new Array(n).fill(0)
        
      let chosen = [house_val[0]]
        
      function add_house(i){
        if (i - chosen[ chosen.length-1 ] < 2)
          chosen[ chosen.length-1 ] = i
        else
          chosen.push(i)
      }
        
      max_theft_val[0] = house_val[0]
    
      let a = house_val[0]
      let b = house_val[1]
    
      if (a > b){
        console.log(`Choosing house 0`)
        max_theft_val[1] = a
        add_house(0)
            
      } else {
        console.log(`Choosing house 1`)
        max_theft_val[1] = b
        add_house(1)
      }
    
      for (let i=2; i<n; i++){
        let a = house_val[i] + max_theft_val[i-2]
        let b = max_theft_val[i-1]
          
        if (a > b){
          console.log(`Choosing house ${i}`)
          max_theft_val[i] = a
          add_house(i)
            
        } else {
          console.log(`Choosing prev best ${i-1}`)
          max_theft_val[i] = b
        }
      }
    
      console.log(`Chosen ${chosen}`)
      return max_theft_val[n-1]
    }
    
    var arr = [1,4,3,40,50]
    
    console.log(JSON.stringify(arr))
    console.log(max_theft(arr, arr.length))

    【讨论】:

      猜你喜欢
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多