• 数据结构与算法 : 动态规划


    经典的 0 1 背包问题: 给定几样物品, 每样物品都有不一样的价值, 同时重量也不一样, 求在一个能承受重量为W的背包中能装物品的最大价值 (大概就是这么描述)

    相似的题目: https://www.luogu.org/problem/P1048 大概意思就是: 山谷里有几颗草药, 每一颗草药价值不一样, 采集花费时间也不一样, 求给定时间内能采集的草药的最大价值

    Java解法:

        public static void main(String[] args) {
            Integer M = 3;  // 草药总数量
            Integer T = 70; // 能用的总时间
    
            Integer result = 0; // 最终总价值
    
            // 下面这两个数组必须要有0这一行, 因为要初始化
            int[] v = new int[]{0, 100, 1, 2}; // 草药价值
            int[] w = new int[]{0, 71, 69, 1}; // 所需时间
    
            // i为当前草药, j为当前剩余时间
            // 如果不采: state[i][j] = state[j-1][j]
            // 如果采:   state[i][j] = state[i-1][j-w[i]] + v[i]
    
            int[][] state = new int[M+1][T+1];
    
            for (int i = 1; i <= M; i++) {
                for (int j = 0; j <= T; j++) {
                    if (j >= w[i]) { // 如果当前时间足够采集这颗草药 取采集或者不采当中价值大的那一个
                        state[i][j] = state[i-1][j] > state[i-1][j-w[i]] + v[i] ? state[i-1][j] : state[i-1][j-w[i]] + v[i];
                    } else { // 否则不采
                        state[i][j] = state[i-1][j];
                    }
                    if (state[i][j] > result) {
                        result = state[i][j];
                    }
                }
            }
            System.out.println("最大价值: " + result);
        }

    动态规划的性能与 背包的重量或者说是这个题目当中的能用的总时间T有关系, 如果这个数太大的话, 动态规划的性能反而会大大下降

  • 相关阅读:
    AI
    CentoOS6.6安装netcat
    ip防刷脚本
    php git pull
    冥想_ PHP抽奖程序概率算法
    如何在CentOS配置Apache的HTTPS服务
    C++ 用RGB 三种颜色绘图
    Linux Vsftpd 连接超时解决方法(被动模式)
    js 函数返回函数
    模拟jquery的$()选择器的实现
  • 原文地址:https://www.cnblogs.com/cccy0/p/11586283.html
Copyright © 2020-2023  润新知