美文网首页
回溯算法:0-1背包问题

回溯算法:0-1背包问题

作者: 云飞扬1 | 来源:发表于2020-12-03 10:40 被阅读0次
/**
 * 0-1背包问题
 */
class Knapsack {

    private lateinit var itemWeightArr: Array<Int>
    private lateinit var itemValueArr: Array<Int>
    private var totalWeight: Int = 0;
    
    private var maxValue = 0
    private var maxSelectedIndexStr = ""

    /**
     * 计算背包问题
     *
     * @param itemWeightArr 物品的重量
     * @param itemValueArr 每个物品的价值
     * @param totalWeight 背包能够容纳的总重量
     */
    fun calc(itemWeightArr: Array<Int>, itemValueArr: Array<Int>, totalWeight: Int) {
        this.itemWeightArr = itemWeightArr
        this.itemValueArr = itemValueArr
        this.totalWeight = totalWeight
        this.maxValue = 0
        this.maxSelectedIndexStr = ""        
        calcRecursive(0, 0, 0, "")
    }

    /**
     * 递归计算
     *
     * @param index 表示开始放第几个物品
     * @param currWeight 表示当前背包的物品总量
     * @param currValue 表示当前背包的物品总价值
     */
    private fun calcRecursive(index: Int, currWeight: Int, currValue: Int, currSelectedStr: String) {
        if (index >= itemWeightArr.size || currWeight == this.totalWeight) {
            if (currValue > this.maxValue) {
                this.maxValue = currValue
                this.maxSelectedIndexStr = currSelectedStr
            }
            return
        }
        //当前物品不放
        calcRecursive(index + 1, currWeight, currValue, currSelectedStr)
        //当前物品放进去
        if (itemWeightArr[index] + currWeight <= this.totalWeight) {
            calcRecursive(index + 1, itemWeightArr[index] + currWeight,
                itemValueArr[index] + currValue, "${currSelectedStr}${if (currSelectedStr.isEmpty()) "" else ","}${index}")
        }
    }

    fun getMaxValue(): Int {
        println(this.maxSelectedIndexStr)
        return this.maxValue
    }
}

测试验证:

    var items: Array<Int> = arrayOf(2, 2, 4, 6, 2)
    var values: Array<Int> = arrayOf(3, 4, 8, 9, 9)
    val knapsack = Knapsack()
    knapsack.calc(items, values, 8)
    println("最大价值:${knapsack.getMaxValue()}")

结果为:

1,2,4
最大价值:21

即选择第 2、3、5 个物品,不仅总重量没有超过背包容量,并且总的价值最大为:21

相关文章

  • 初识动态规划

    0-1 背包问题 备忘录 动态规划-二维数组 动态规划-一维数组 0-1 背包问题升级版 回溯算法 动态规划-二维...

  • 回溯算法---0-1背包问题

    引言:这道题目老师强调了肯定要考,所以只有硬着头皮将其复习了;下面是自己学习回溯算法的学习,仅供参考;一:基本概念...

  • 回溯算法:0-1背包问题

    测试验证: 结果为: 即选择第 2、3、5 个物品,不仅总重量没有超过背包容量,并且总的价值最大为:21

  • 编程

    今天用0-1算法,编写了背包问题!

  • 用回溯算法求解0-1背包问题

    打个比喻,我们的人生会面临无数的选择,我们每次选择的时候都会选择自己任务的最优解,但最终的结果并不一定是最优解,可...

  • 回溯算法:八皇后问题和0-1背包问题

    文章结构 如何理解回溯算法 回溯算法的经典应用 完整源码 图片来源 1. 如何理解回溯算法 1.1 什么是回溯算法...

  • 0-1背包问题

    或许在做算法题的老手手里,0-1背包问题算不上什么难事。可以说是最简单的背包问题了。不过我之前还真没有写过0-1背...

  • Algorithm进阶计划 -- 动态规划(下)

    经典动态规划背包问题最长子序列问题 1. 背包问题 1.1 0-1 背包问题 0-1 背包问题,描述如下: 上面...

  • 0-1背包问题(回溯法)

    0-1背包问题 在0 / 1背包问题中,需对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i...

  • 0-1背包问题(回溯法)

    0-1背包问题有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容...

网友评论

      本文标题:回溯算法:0-1背包问题

      本文链接:https://www.haomeiwen.com/subject/enfmwktx.html