题解 | #购物单#

购物单

https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4

package main

import (
	"fmt"
)

func main() {
    money, n := 0, 0
    fmt.Scan(&money, &n)
    price := make(map[int][]int)
    value := make(map[int][]int)
    for i := 0; i < n; i++ {
        spand, val, index := 0, 0, 0
        fmt.Scan(&spand, &val, &index)
        
        if index == 0 {
            if  _, ok := price[i+1]; !ok {
                price[i+1] = make([]int, 3)
                value[i+1] = make([]int, 3)
            }
            price[i+1][0] = spand
            value[i+1][0] = val
        } else {
            if _, ok := price[index]; !ok {
                price[index] = make([]int, 3)
                value[index] = make([]int, 3)
            }
            if price[index][1] == 0 {
                price[index][1] = spand
                value[index][1] = val
            } else {
                price[index][2] = spand
                value[index][2] = val
            }
        }
    }
    dp := make([]int, money+1)
    for i := 0; i <= n; i++ {
        if len(price[i]) == 0 {
            continue
        }
        for j := money; j >= price[i][0]; j-- {
            dp[j] = max(dp[j], dp[j-price[i][0]]+price[i][0]*value[i][0])
            if price[i][1] != 0 && price[i][0] + price[i][1] <= j {
                dp[j] = max(dp[j], dp[j-price[i][0]-price[i][1]]+price[i][0]*value[i][0]+price[i][1]*value[i][1])
            }
            if price[i][2] != 0 && j >= price[i][0]+price[i][2] {
				dp[j] = max(dp[j], dp[j-price[i][0]-price[i][2]]+price[i][0]*value[i][0]+price[i][2]*value[i][2])
			}
			if price[i][1] != 0 && price[i][2] != 0 && j >= price[i][0]+price[i][1]+price[i][2] {
				dp[j] = max(dp[j], dp[j-price[i][0]-price[i][1]-price[i][2]]+price[i][0]*value[i][0]+price[i][1]*value[i][1]+price[i][2]*value[i][2])
			}
        }
    }
    fmt.Print(dp[money])
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务