主要场景:有一个背包,这个背包有固定的体积,需要在背包里装东西,每一个东西都有自己的体积和价值,每个东西只能装一次,怎么装能使得这个包能装得下的东西中价值和最大? N:表示可以装进包里的东西的个数 V:表示这个背包的体积 weight[N]:表示重量的数组 value[N]:表示价值的数组 dp[V]:表示包里的总价值的数组
weight = [3, 2, 2, 8, 4, 2, 2, 7] value = [3, 4, 2, 7, 5, 3, 1, 6] V = 12, N = 8; 那么这个表格为:
i \ j12111098765432113333333333002555555333300377775555332041311111088553320513111110885533206131111108855332071313121010775532281412121099755322行代表包剩余的体积为j,列代表物品的id 所以最大的价值为14 代码实现为:
public class Bag_01 { public static void main(String[] args) { int []value = {0, 3, 2, 2, 8, 4, 2, 2, 7}; int []weight = {0, 3, 4, 2, 7, 5, 3, 1, 6}; int a = bag01(8, 12, value, weight); System.out.println(a); } public static int bag01(int N, int V, int []value, int[]weight){ int []dp = new int [V+1]; for(int i = 1; i <= N; i++){ for(int j = V; j >= weight[i]; j--){ dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); } } return dp[V]; } public static int max(int a, int b){ if(a > b) return a; else return b; } }