动态规划算法—01背包问题

目录

1、动态规划的基本思想

2、动态规划的典型例子---01背包问题

解法思路

每个格子的值的含义

填写表格的顺序

两个策略

手把手全流程教学

代码实现


1、动态规划的基本思想

2、动态规划的典型例子---01背包问题

①"01"的概念:一个物品,要么装进背包、要么不装。

解法思路

要想解决原问题,就先解决子问题(这句话是动态规划的核心思想)。

大白话:

  • 你不是要求物品数量是4吗,那我就先求出物品数量是3的最大价值、物品数量是2的最大价值、物品数量是1的最大价值、物品数量是0的最大价值。
  • 你不是要求背包容量是5吗,那我就先求出背包容量是4的最大价值、背包容量是3的最大价值、背包容量是2的最大价值、背包容量是1的最大价值、背包容量是0的最大价值。

从上面两个维度,可以求出子问题,然后通过子问题,最终求解原问题。这就是动态规划的魅力。

然后上述两个维度的缩放,可以画成下面的一张二维数组表格。

每个格子的值的含义

每个格子的值,就是对应的情况的最大价值。

举例:

下图红框的值,即2,就是当物品数量为1、背包容量为1时的最大价值。其他值也同理。

填写表格的顺序

从上到下,一行一行的来。

两个策略

  • 选当前物品:最大价值 = 当前选中的物品的价值 + 剩余背包容量去上一行发挥出的最大价值
  • 不选当前物品:最大价值 = 上方相邻格子的价值

每一个格子,我们都需要考虑上方两种情况,并且取值 max(策略1, 策略2),选价值最大的策略。

手把手全流程教学

第①步骤:先处理边界

  • 当i=0(即物品数量为0),此时没物品可选,所以最大价值为0,故第一行全是0
  • 当j=0(即背包容量为0),此时啥都装不下,所以最大价值为0,故第一列全是0

代码实现

java 复制代码
public class test01 {
    public static void main(String[] args) {
        //先定义题目描述的东西
        int N = 4;//原问题的物品数量:4个
        int W = 5;//原问题的背包容量:5
        int v[] = {0, 2, 4, 5, 6};//第0~4个物品的价值
        int w[] = {0, 1, 2, 3, 4};//第0~4个物品的重量

        //定义待填充的二维数组表格(专业术语叫dp数组)
        int[][] f = new int[N+1][W+1];

        //开始循环,填充DP数组(二维表格)
        for(int i=1; i<=N; i++){
            for(int j=1; j<=W; j++){
                //每个格子,都要考虑 选/不选 当前物品,并且取二者的价值较大者,填入当前格子
                if(j>=w[i]){
                    f[i][j] = Math.max(f[i-1][j], v[i]+f[i-1][j-w[i]]);
                }else{
                    f[i][j] = f[i-1][j];
                }
            }
        }

        //输出结果,最大价值就是f[N][W]的值(即DP数组右下角的那个格子的值)
        System.out.println("最大价值:"+f[N][W]);

    }
}

运行结果:

可见此时没问题。

我们还可以将DP数组打印出来,看看和我们之前手动填充的表格一致吗?

java 复制代码
//打印出DP数组
for (int i = 0; i <= N; i++) {
    // 内层循环控制列 (j),从 0 到 W
    for (int j = 0; j <= W; j++) {
        // 打印当前格子的值,使用 \t (制表符) 分隔,使对齐更美观
        System.out.print(f[i][j] + "\t");
    }
    // 【关键】每一行打印完后,输出一个换行符
    System.out.println();
}

可见此时,通过程序跑出的结果,和我们之前手动推导的一模一样。

相关推荐
澳鹏Appen9 小时前
澳鹏重磅发布ExamOCRBench:面向端到端试卷判分的多任务基准
算法·benchmark·基准评测
benjormin10 小时前
Java数据结构 二叉搜索树
数据结构·算法
人工智能培训10 小时前
知识图谱:结构化表达实体与关系的知识组织技术
大数据·人工智能·算法·重构·生活·知识图谱
地平线开发者10 小时前
QAT 实战:从 PyTorch 模型到 J6E 实板精度与延时验证
pytorch·算法·自动驾驶
IT星宿10 小时前
github-gravity:用 Rapier2D 把 GitHub 贡献图做成 SVG 物理动画
算法·github
♡すぎ♡11 小时前
SWE 的基本条件
算法·swe·浅水模拟
郝学胜-神的一滴12 小时前
AI 编程智能体 17:四步搞定专属AI智能体
大数据·人工智能·python·神经网络·算法·langchain·强化学习
微尘hjx12 小时前
【StrongSort 03】多轨迹算法StrongSort改进点
人工智能·算法·yolo·视觉检测·ultralytics·strongsort·轨迹算法
梦帮科技12 小时前
QML-04-QGraph-Diff:量子非欧图扩散生成模型与 SE(3) 等变分子晶格逆向合成完整技术指南(上部分)
人工智能·算法·自动化·量子计算·傅里叶分析
七牛开发者12 小时前
TokenGate:端到端可训练的 Token 剪枝机制,让大模型 Prefill 提速 11.3 倍
算法·机器学习·剪枝·长上下文·tokengate