R中的背包动态

时间:2018-10-12 09:17:00

标签: r knapsack-problem

我正在尝试实施wikepedia的sudo代码,以解决背包问题,但是我的代码失败。 我的函数将带有两列的数据框X作为输入,第一个是权重,第二个是值

 weights value
    10   110
    20   150
    15   180
    30   170
    18   130

knapsnack_dyn<-function(X,W){
  w<-c(0,X[,1])
  v<-c(0,X[,2])
  n<-nrow(X)
  m<- matrix(0,nrow=n+1,ncol=W+1)
  keep<-m
  res<-c()
  for (i in 1:n+1){
    for (j in 0:W+1){
      if (w[i]>j ){
        m[i,j]<-m[i-1,j]
        keep[i,j]<-0
      }else{
        m[i,j]<-max(m[i-1, j], m[i-1, j-w[i]] + v[i])
        keep[i,j]<-1
      }
    } 
  }
  K=W+1
  for (i in n+1:1){
    if(keep[i,K]==1){
      res[i]<-i
      K=K-w[i]
    }
  }
return(c(res,m[n+1,W+1]))
}

0 个答案:

没有答案