01背包依赖算法go实现
func main ( ) {
for {
var cap , total int
_ , err := fmt. Scanln ( & cap , & total)
if err != nil {
break
}
cap = cap / 10
var weight [ 60 ] [ 3 ] int
var value [ 60 ] [ 3 ] int
p := make ( [ ] int , total+ 1 )
q := make ( [ ] int , total+ 1 )
v := make ( [ ] int , total+ 1 )
for i := 1 ; i <= total ; i++ {
fmt. Scanln ( & v[ i] , & p[ i] , & q[ i] )
v[ i] /= 10
if q[ i] == 0 {
weight[ i] [ 0 ] = v[ i]
value[ i] [ 0 ] = v[ i] * p[ i]
} else {
if weight[ q[ i] ] [ 1 ] == 0 {
weight[ q[ i] ] [ 1 ] = v[ i]
value[ q[ i] ] [ 1 ] = v[ i] * p[ i]
} else {
weight[ q[ i] ] [ 2 ] = v[ i]
value[ q[ i] ] [ 2 ] = v[ i] * p[ i]
}
}
}
w1 := [ ] [ 3 ] int { { 0 , 0 , 0 } }
v1 := [ ] [ 3 ] int { { 0 , 0 , 0 } }
for i := 1 ; i <= total ; i++ {
if weight[ i] [ 0 ] != 0 {
w1 = append ( w1, weight[ i] )
v1 = append ( v1, value[ i] )
}
}
fmt. Println ( getMaxValue ( w1, v1, cap ) * 10 )
}
}
func getMaxValue ( w, v [ ] [ 3 ] int , cap int ) int {
length := len ( w)
pkg := make ( [ ] [ ] int , length)
for i := 0 ; i < length ; i++ {
pkg[ i] = make ( [ ] int , cap + 1 )
}
for i := 1 ; i < length ; i++ {
for j := cap ; j > 0 ; j-- {
pkg[ i] [ j] = pkg[ i- 1 ] [ j]
if j >= w[ i] [ 0 ] {
pkg[ i] [ j] = max ( pkg[ i] [ j] , pkg[ i- 1 ] [ j- w[ i] [ 0 ] ] + v[ i] [ 0 ] )
}
if j >= w[ i] [ 0 ] + w[ i] [ 1 ] {
pkg[ i] [ j] = max ( pkg[ i] [ j] , pkg[ i- 1 ] [ j- w[ i] [ 0 ] - w[ i] [ 1 ] ] + v[ i] [ 0 ] + v[ i] [ 1 ] )
}
if j >= w[ i] [ 0 ] + w[ i] [ 2 ] {
pkg[ i] [ j] = max ( pkg[ i] [ j] , pkg[ i- 1 ] [ j- w[ i] [ 0 ] - w[ i] [ 2 ] ] + v[ i] [ 0 ] + v[ i] [ 2 ] )
}
if j >= w[ i] [ 0 ] + w[ i] [ 1 ] + w[ i] [ 2 ] {
pkg[ i] [ j] = max ( pkg[ i] [ j] , pkg[ i- 1 ] [ j- w[ i] [ 0 ] - w[ i] [ 1 ] - w[ i] [ 2 ] ] + v[ i] [ 0 ] + v[ i] [ 1 ] + v[ i] [ 2 ] )
}
}
}
return pkg[ length- 1 ] [ cap ]
}
func max ( n, m int ) int {
if n > m {
return n
}
return m
}