数据结构与算法 : 动态规划
经典的 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有关系, 如果这个数太大的话, 动态规划的性能反而会大大下降