-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy path01BackpackUpgrade.kt
83 lines (70 loc) · 2.08 KB
/
01BackpackUpgrade.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package com.daily.algothrim.dp
/**
* 01-背包升级版,增加背包价值,求最大价值。
*/
class `01BackpackUpgrade` {
companion object {
@JvmStatic
fun main(args: Array<String>) {
println(`01BackpackUpgrade`().dp(5, intArrayOf(2, 2, 4, 6, 3), intArrayOf(3, 4, 8, 9, 6), 9))
println(`01BackpackUpgrade`().dp2(5, intArrayOf(2, 2, 4, 6, 3), intArrayOf(3, 4, 8, 9, 6), 9))
}
}
/**
* O(n * w)
*/
fun dp(n: Int, item: IntArray, value: IntArray, w: Int): Int {
val status = Array(n) { IntArray(w + 1) { -1 } }
status[0][0] = 0
if (item[0] <= w) status[0][item[0]] = value[0]
var i = 1
while (i < n) {
var j = 0
while (j <= w) { // 不装
if (status[i - 1][j] >= 0) status[i][j] = status[i - 1][j]
j++
}
var k = 0
while (k <= w - item[i]) { // 装
if (status[i - 1][k] >= 0) {
// notice
val v = status[i - 1][k] + value[i]
if (v > status[i][k + item[i]]) {
status[i][k + item[i]] = v
}
}
k++
}
i++
}
var maxV = -1
status[n - 1].forEach {
if (it > maxV) maxV = it
}
return maxV
}
fun dp2(n: Int, item: IntArray, value: IntArray, w: Int): Int {
val status = IntArray(w + 1) { -1 }
status[0] = 0
if (item[0] <= w) status[item[0]] = value[0]
var i = 1
while (i < n) {
var j = w - item[i]
while (j >= 0) {
if (status[j] >= 0) {
val v = status[j] + value[i]
if (v > status[j + item[i]]) {
status[j + item[i]] = v
}
}
j--
}
i++
}
var maxV = -1
status.forEach {
if (it > maxV) maxV = it
}
return maxV
}
}