动态编程背包仅选择R中的唯一项

时间:2017-10-24 14:15:05

标签: r dynamic-programming knapsack-problem

我有这个代码,它选择多个项目放在数据框的背包中。我希望它只从数据框中选择一个项目: -

knapsack_volume<-function(Data, W, Volume, full_K){

Data = Data

# Data must have the colums with names: item, value, weight and volume.
K<-list() # hightest values
K_item<-list() # itens that reach the hightest value
K<-rep(0,W+1) # The position '0'

K_item<-rep('',W+1) # The position '0'


# while(length(Data$item) != 1){
  for(w in 1:W){

    temp_w<-0
    temp_item<-''
    temp_value<-0

    for(i in 1:dim(Data)[1]){ # each row

      wi<-Data$weight[i] # item i
      vi<- Data$value[i]
      item<-Data$item[i]
      volume_i<-Data$volume[i]



      if(wi<=w & volume_i <= Volume){

        back<- full_K[[Volume-volume_i+1]][w-wi+1]
        temp_wi<-vi + back

        if(temp_w < temp_wi){

          temp_value<-temp_wi
          temp_w<-temp_wi
          temp_item <- item
        }   
      }

      # Data = Data[-i, ]

    }
    K[[w+1]]<-temp_value
    K_item[[w+1]]<-temp_item
  }

return(list(K=K,Item=K_item))
}

DataFrame看起来像: -

项目值重量

A 40 4 8

B 80 8 12

C 20 4 6

D 100 10 14

E 65 8 8

F 60 10 5

G 70 5 12

H 45 5 7

I 60 6 6

J 60 4 8

您可以使用以下方式重现数据框: -

Data = data.frame(item = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J"), 
value = c(40, 80, 20, 100, 65, 60, 70, 45, 60, 60), weight = c(4, 8, 4, 10, 8, 
10, 5, 5, 6, 4), volume = c(8, 12, 6, 14, 8, 5, 12, 7, 6, 8))

由于

1 个答案:

答案 0 :(得分:1)

将数据放入背包后,如何从数据框中删除该项目?但是,您需要保证您的背包可以完全填充独特的物品。