题目链接:www.nowcoder.com/practice/f9…
注:以下仅为解题参考,运行时间非最优
1. 输入数据的处理
func process() {
sc := bufio.NewScanner(os.Stdin)
sc.Scan()
line := sc.Text()
vars := strings.Split(line, " ")
n, _ := strconv.Atoi(vars[0])
w, _ := strconv.Atoi(vars[1])
weights := make([][]int, n)
vals := make([][]int, n)
for i := 0; i < n; i++ {
weights[i] = make([]int, 3)
vals[i] = make([]int, 3)
}
i := 0
for sc.Scan() {
line = sc.Text()
vars = strings.Split(line, " ")
weight, _ := strconv.Atoi(vars[0])
price, _ := strconv.Atoi(vars[1])
isMaster, _ := strconv.Atoi(vars[2])
weights[i][0] = weight
val := weight * price
vals[i][0] = val
if isMaster != 0 {
weights[i][1], weights[i][2] = -1, -1
mIdx := isMaster - 1
if weights[mIdx][1] == 0 {
weights[mIdx][1] = weight
vals[mIdx][1] = val
} else if weights[mIdx][2] == 0 {
weights[mIdx][2] = weight
vals[mIdx][2] = val
}
}
i++
}
}
2. 获取最大值
// 主件可以带一个附件或者两个附件
func GetMaxValues(weights [][]int, vals [][]int, n, w int) int {
// 这里的两个误区,一个是物品是否用完,一个是预算是否用完,其实都不是,最大满意度可能动态出现在中间,买了a个物品,花了b块钱时
// 每个物品是唯一的,主附件的对应关系也是唯一的
ans := 0
dp := make([][]int, n+1)
dp[0] = make([]int, w+1)
for i := 1; i <= n; i++ {
dp[i] = make([]int, w+1)
for j := 1; j <= w; j++ {
dp[i][j] = dp[i - 1][j]
// 如果不是主件,跳过
if weights[i-1][1] == -1 && weights[i-1][2] == -1 {
continue
}
// 只买一个主件
if weights[i-1][0] <= j {
dp[i][j] = max(dp[i][j], dp[i-1][j-weights[i-1][0]]+vals[i-1][0])
}
// 只买主件和附件1
if weights[i-1][1] > 0 && weights[i-1][0]+weights[i-1][1] <= j {
dp[i][j] = max(dp[i][j], dp[i-1][j-weights[i-1][0]-weights[i-1][1]]+vals[i-1][0]+vals[i-1][1])
}
// 只买主件和附件2
if weights[i-1][2] > 0 && weights[i-1][0]+weights[i-1][2] <= j {
dp[i][j] = max(dp[i][j], dp[i-1][j-weights[i-1][0]-weights[i-1][2]]+vals[i-1][0]+vals[i-1][2])
}
// 买主件和附件1和附件2
if weights[i-1][1] > 0 && weights[i-1][2] > 0 && weights[i-1][0]+weights[i-1][2]+weights[i-1][1] <= j {
dp[i][j] = max(dp[i][j], dp[i-1][j-weights[i-1][0]-weights[i-1][2]-weights[i-1][1]]+vals[i-1][0]+vals[i-1][2]+vals[i-1][1])
}
ans = max(ans, dp[i][j])
}
}
return ans
}
func max(a, b int) int {
if a > b {
return a
}
return b
}