动态规划之------01背包问题

题目描述

假设目前共有a,b,c,d ,e这5件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包, 怎么装背包,可以才能带走最多的财富。

01背包问题是动态规划算法很经典的问题
状态转移方程: f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] }
f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。
Pi表示第i件物品的价值。
决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中吗 ?

在这里插入图片描述

这张表是至底向上,从左到右生成的,横坐标是物品种类有哪些,纵坐标代表背包容量大小,例如: (c, 5) 表示目前物品有c\d\e三种且背包容量为5能带走的最大价值。你可以根据上面的状态转移公式对应这张表,如果你看懂了那么你就理解了01背包问题的动态规划算法了!

代码

package LeeCode;

public class get01PackageAnswer {

    public static void testPackage() {
        Package[] pg = {new Package("e", 4, 6),
                new Package("d", 5, 4),
                new Package("c", 6, 5),
                new Package("b", 2, 3),
                new Package("a", 2, 6)};

        int[][] state = new int[pg.length][11];
        int newValue = 0;
        /*
        背包的状态转换方程:
        f[i][j] = Max{f[i-1][j], f[i-1, j-Wi] + Pi}
         */

        for (int i = 0; i < state.length; i++) {
            for (int j = 0; j < state[i].length; j++) {
                if (i == 0) {
                    if (j >= pg[i].getWeight()) {
                        state[i][j] = pg[i].getValue();
                    }
                } else {
                    state[i][j] = state[i - 1][j];
                    if (j < pg[i].getWeight()) {
                        continue;
                    }
                    newValue = state[i - 1][j - pg[i].getWeight()] + pg[i].getValue();
                    state[i][j] = Math.max(state[i - 1][j], newValue);
                }
            }
        }
    }

    public static void main(String[] args) {
        testPackage();
    }

}

class Package {
    private String name;
    private int weight;
    private int value;

    public Package(String name, int weight, int value) {
        this.name = name;
        this.weight = weight;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public int getWeight() {
        return weight;
    }

    public int getValue() {
        return value;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值