动态规划之背包问题

文章目录

  • 写在前面
  • 上代码

写在前面

最近在看动态规划问题,期中最经典的莫非背包问题,大致描述就是,给你一个背包,背包容量为total,再给你n种商品,每种商品都有它自己的重量、价值、数量,问你要怎么装才能让价值达到最大化。

背包问题网上又大致分为三种:
1、01背包问题:就是每种商品只有1个,也就是装或者不装两种状态,也就是0和1。
2、完全背包问题:就是每种商品有无数个,你看随意装多少个都行。
3、分组背包问题:就是每种商品只有k个,你可以装k个以内。

发现上面三种情况,其实都是第3中情况的子集。当k=1,就变成了01背包问题,当k=无穷大,就变成了完全背包问题,所以解题思路和代码其实都可以是一样的,如果性能要求没有那么极致的话。

我现在没有时间整理博客,只是简单的记录一下我解决这三种问题的统一代码,有时间再整理一下。

上代码

需要了解背包问题解题思路才能看懂以下代码,以后有空再写。

fun main() {

    val total = 50// 背包容量
    val ws = arrayOf(0, 10, 15, 20, 25)// 商品重量,0是自己加的,便于遍历
    val vs = arrayOf(0, 200, 250, 350, 500)// 商品价值,0是自己加的,便于遍历
    val cs = arrayOf(0, 4, 3, 2, 1)// 商品数量,分组背包问题才有数量

    // 二维数据,Array[商品][背包容量],背包容量也是自己加了个0,便于遍历
    // 第一行、第一列全部默认为0
    val dp = Array(ws.size) { Array(total + 1) { 0 } }
    // 遍历商品
    for (row in 1 until ws.size) {
        // 遍历容量
        for (col in 1..total) {
            val weight = ws[row]// 当前商品重量
            val value = vs[row]// 当前商品价值

            // 当前商品数量
            // 01背包问题,数量就是1
            // 完全背包问题,没有数量,以下k<=count的判断也不需要
            val count = cs[row]

            var maxValue = 0

            // 取k个物品
            var k = 0
            while (k <= count && weight * k <= col) {
                val temp = value * k + dp[row - 1][col - weight * k]
                if (temp > maxValue) maxValue = temp
                k++
            }

            dp[row][col] = maxValue
        }
    }
    println(dp[ws.size - 1][total])
}

你可能感兴趣的:(动态规划,算法,背包问题)