[程序员的常用算法]之动态规划-背包问题
1.背景
算法在面试中经常问到....
2.代码
package com.ldp.algorithm.demo01; import org.junit.Test; import java.util.Arrays; /** * @create 05/18 9:23 * @description <p> * 动态规划-背包问题 * </p> */ public class Test03BeiBao { @Test public void test() { method(); } public void method() { // 物品的重量 int[] w = {1, 4, 3}; // 物品的价值 int[] val = {1500, 3000, 2000}; // 背包的容量 int m = 4; // 物品的个数 int n = val.length; // v[i][j]创建二维数组,表示前i个商品放入背包容量为j的包中的最大价值 int[][] v = new int[n + 1][m + 1]; // 记录放入的商品 int[][] path = new int[n + 1][m + 1]; // 第一列设置为0 for (int i = 0; i < v.length; i++) { v[i][0] = 0; } // 第一行设置为0 for (int i = 0; i < v[0].length; i++) { v[0][i] = 0; } // 根据公式 for (int i = 1; i < v.length; i++) { // 第一行不处理,默认为零 for (int j = 1; j < v[0].length; j++) {// 第一列不处理,默认为零 // 公式 if (w[i - 1] > j) { v[i][j] = v[i - 1][j]; } else { if (v[i - 1][j] < val[i - 1] + v[i - 1][j - w[i - 1]]) { v[i][j] = val[i - 1] + v[i - 1][j - w[i - 1]]; // 记录放入数据 path[i][j] = 1; } else { v[i][j] = v[i - 1][j]; } } } } print(v); // 查看放入背包的商品 int i = v.length - 1; int j = v[0].length - 1; while (i >= 0 && j >= 0) { if (path[i][j] == 1) { System.out.printf("商品%s放入背包,重量:%s,价值:%s \n", i, w[i - 1], val[i - 1]); j -= w[i - 1]; } i--; } } public void print(int[][] v) { for (int i = 0; i < v.length; i++) { System.out.println(Arrays.toString(v[i]) + "\t"); } } }

浙公网安备 33010602011771号