题解 | #购物单# Golang实现
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
package main
import (
"fmt"
)
type Good struct {
price int
value int
relyOn int
id int
attachment []Good
}
func (c *Good) AddAttachment(good Good) {
c.attachment = append(c.attachment, good)
}
func (c *Good) CalculateSatisfaction(n int) int {
switch n {
case 0:
return c.price * c.value
case 1:
return c.price*c.value + c.attachment[0].price*c.attachment[0].value
case 2:
return c.price*c.value + c.attachment[1].price*c.attachment[1].value
case 3:
return c.price*c.value + c.attachment[0].price*c.attachment[0].value + c.attachment[1].price*c.attachment[1].value
}
return 114514
}
func (c *Good) CalculatePrice(n int) int {
switch n {
case 0:
return c.price
case 1:
return c.price + c.attachment[0].price
case 2:
return c.price + c.attachment[1].price
case 3:
return c.price + c.attachment[0].price + c.attachment[1].price
}
return 114514
}
func (c Good) Check(n int) bool {
if n == 0 {
return true
}
if n == 1 && len(c.attachment) >= 1 {
return true
}
if n > 1 && len(c.attachment) >= 2 {
return true
}
return false
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
var N, m int
var goods []Good
var attachments []Good
fmt.Scanf("%d %d", &N, &m)
for i := 1; i <= m; i++ {
var price, value, isAttachment int
fmt.Scanf("%d %d %d", &price, &value, &isAttachment)
if isAttachment == 0 {
goods = append(goods, Good{
price: price,
value: value,
relyOn: -1,
id: i,
attachment: []Good{},
})
} else {
attachments = append(attachments, Good{
price: price,
value: value,
id: -1,
relyOn: isAttachment,
attachment: nil})
}
}
for _, v := range attachments {
idx := 0
for j, val := range goods {
if val.id == v.relyOn {
idx = j
break
}
}
goods[idx].AddAttachment(v)
}
dp := make([][]int, len(goods)+1)
for i := 0; i <= len(goods); i++ {
dp[i] = make([]int, N+1)
}
for i := 1; i < len(dp); i++ {
for j := 0; j < len(dp[0]); j += 10 {
dp[i][j] = dp[i-1][j]
for k := 0; k <= 3; k++ {
if !goods[i-1].Check(k) {
continue
}
if j >= goods[i-1].CalculatePrice(k) {
//fmt.Printf("i:%d j:%d k:%d dpi-1j: %d res:%d\n", i, j, k, dp[i-1][j], dp[i-1][j-goods[i-1].CalculatePrice(k)]+goods[i-1].CalculateSatisfaction(k))
dp[i][j] = max(dp[i][j], dp[i-1][j-goods[i-1].CalculatePrice(k)]+goods[i-1].CalculateSatisfaction(k))
}
}
}
}
fmt.Printf("%d\n", dp[len(goods)][N])
}
Golang实现,欢迎大家一起讨论。
