September 2017 Update
This commit is contained in:
parent
bba7bfd280
commit
ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions
|
|
@ -0,0 +1,82 @@
|
|||
// version 1.1.2
|
||||
|
||||
data class Item(val name: String, val weight: Int, val value: Int, val count: Int)
|
||||
|
||||
val items = listOf(
|
||||
Item("map", 9, 150, 1),
|
||||
Item("compass", 13, 35, 1),
|
||||
Item("water", 153, 200, 2),
|
||||
Item("sandwich", 50, 60, 2),
|
||||
Item("glucose", 15, 60, 2),
|
||||
Item("tin", 68, 45, 3),
|
||||
Item("banana", 27, 60, 3),
|
||||
Item("apple", 39, 40, 3),
|
||||
Item("cheese", 23, 30, 1),
|
||||
Item("beer", 52, 10, 3),
|
||||
Item("suntan cream", 11, 70, 1),
|
||||
Item("camera", 32, 30, 1),
|
||||
Item("T-shirt", 24, 15, 2),
|
||||
Item("trousers", 48, 10, 2),
|
||||
Item("umbrella", 73, 40, 1),
|
||||
Item("waterproof trousers", 42, 70, 1),
|
||||
Item("waterproof overclothes", 43, 75, 1),
|
||||
Item("note-case", 22, 80, 1),
|
||||
Item("sunglasses", 7, 20, 1),
|
||||
Item("towel", 18, 12, 2),
|
||||
Item("socks", 4, 50, 1),
|
||||
Item("book", 30, 10, 2)
|
||||
)
|
||||
|
||||
val n = items.size
|
||||
|
||||
const val MAX_WEIGHT = 400
|
||||
|
||||
fun knapsack(w: Int): IntArray {
|
||||
val m = Array(n + 1) { IntArray(w + 1) }
|
||||
for (i in 1..n) {
|
||||
for (j in 0..w) {
|
||||
m[i][j] = m[i - 1][j]
|
||||
for (k in 1..items[i - 1].count) {
|
||||
if (k * items[i - 1].weight > j) break
|
||||
val v = m[i - 1][j - k * items[i - 1].weight] + k * items[i - 1].value
|
||||
if (v > m[i][j]) m[i][j] = v
|
||||
}
|
||||
}
|
||||
}
|
||||
val s = IntArray(n)
|
||||
var j = w
|
||||
for (i in n downTo 1) {
|
||||
val v = m[i][j]
|
||||
var k = 0
|
||||
while (v != m[i - 1][j] + k * items[i - 1].value) {
|
||||
s[i - 1]++
|
||||
j -= items[i - 1].weight
|
||||
k++
|
||||
}
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val s = knapsack(MAX_WEIGHT)
|
||||
println("Item Chosen Weight Value Number")
|
||||
println("--------------------- ------ ----- ------")
|
||||
var itemCount = 0
|
||||
var sumWeight = 0
|
||||
var sumValue = 0
|
||||
var sumNumber = 0
|
||||
for (i in 0 until n) {
|
||||
if (s[i] == 0) continue
|
||||
itemCount++
|
||||
val name = items[i].name
|
||||
val number = s[i]
|
||||
val weight = items[i].weight * number
|
||||
val value = items[i].value * number
|
||||
sumNumber += number
|
||||
sumWeight += weight
|
||||
sumValue += value
|
||||
println("${name.padEnd(22)} ${"%3d".format(weight)} ${"%4d".format(value)} ${"%2d".format(number)}")
|
||||
}
|
||||
println("--------------------- ------ ----- ------")
|
||||
println("Items chosen $itemCount ${"%3d".format(sumWeight)} ${"%4d".format(sumValue)} ${"%2d".format(sumNumber)}")
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue