动态规划-01背包问题,超级详细

题目 我这里就不想再重复写了 ,给一个撸友写得不错的地址:https://blog.youkuaiyun.com/apple1414/article/details/100935043

我这里只是为了贴代码,注释都在代码里面了,如果有不懂或者我写得不对的可以下方留言。

/**
 * @author jiezhou
 * @CalssName: DynamicPlanning
 * @Package org.buptdavid.datastructure.zj.shangguigu.com.atguigu.程序员10大算法.DP
 * @Description: 动态规划-0-1背包问题
 * @date 2020/9/1/14:52
 */
public class DynamicPlanning {
    private static int[][] v;//二维数组,用于填表过程,最终最右下角的的值就是我们需要的解
    private static Map<Integer, Integer> goods = new HashMap<>();//物品

    public static void main(String[] args) {
        init(4);
        process();
        /*打印的填的表可能会和网上的不同,但最终的结果看肯定是唯一的,不同的原因取决于goods map的顺序*/
        list();
        System.out.println(v[v.length - 1][v[v.length - 1].length - 1]);//输出最终右下角的值
    }

    private static void list() {
        for (int i = 0; i < v.length; i++) {
            for (int j = 0; j < v[i].length; j++) {
                System.out.print(v[i][j] + " ");
            }
            System.out.println();
        }
    }

    /**
     * 填表过程
     */
    private static void process() {
        /*以下是填表过程*/
        int i = 0;
        for (Map.Entry<Integer, Integer> entry : goods.entrySet()) {
            i++;
            Integer wi = entry.getKey();
            Integer vi = entry.getValue();
            for (int j = 1; j < v[i].length; j++) {//得到列 1 2 3 4 磅 也就是背包假如取的容量
                if (j >= wi) {//如果当前背包容量大于要添加物品的容量
                    v[i][j] = Math.max(v[i - 1][j], vi + v[i - 1][j - wi]);//v[i-1][j-wi]  这个的解释:我的理解: 使用当前背包的容量(j)-当前添加的物品的重量  用这个值作为列 ,行(hang)的话就使用当前的上一行
                } else {//背包容量小于要添加物品的容量 直接使用上个单元格的值
                    v[i][j] = v[i - 1][j];
                }
            }
        }
    }

    /**
     * 初始化
     *
     * @param w 背包的容量
     */
    public static void init(int w) {
        goods.put(1, 1500);
        goods.put(4, 3000);
        goods.put(3, 2000);
        v = new int[goods.size() + 1][w + 1];//这里行列都加1是为了做没有添加物品的时候当背包的容量为0,物品的价值也就为0。
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值