01背包 -动态规划-java实现
题目:
给你一个可装载重量为W的背包和N个物品,每个物品有重量和价值两个属性。其中第i个物品的重量为wt[i],价值为val[i],现在让你用这个背包装物品,最多能装的价值是多少?
step1:状态和选择
1.状态:背包容量、可选择的物品。
2.选择: 物体装进背包、不装进背包
step2:定义dp table
明确dp table的定义:
dp[i][w]含义为:对前i个物体时,剩余容量为w,有最大价值dp[i][w]。
step3:通过“选择”来确定“状态转移方程”
1. 首先考虑:背包剩余容量一定装不下第i个物体:
则 dp[i][w]=dp[i-1][w];
2. 装入还是不装入 ,择优处理:
在dp[i-1][w-wt[i-1]]+val[i-1] 和 dp[i-1][w]选较大值
就这样一直处理到对前N个物体,剩余容量为W的最终情况,得出完整dp表
话不多说上代码:
输出:
具体代码实现:(IDEA通过)
public class Bag0_1_ {
public int[] wt;
public int[] val;
public static void main(String[] args) {
int w[] = {
4, 2, 3, 6, 5, 6};
int val[] = {
6, 4, 8, 9, 10, 4};
System.out.println(fun(12,6,w,val));
}
static int max(int a, int b) {
return a > b ? a : b;
}
//容量为w的背包,来装n个物体。
static int fun(int W, int N, int wt[], int val[]) {
int[][] dp = new int[N + 1][W + 1];//dp[i][w]表示剩余容量为w时,装入前i个物体。
for (int i = 1; i <= N; ++i) {
for (int w = 1; w <= W; ++w) {
if (w - wt[i - 1] < 0)
dp[i][w] = dp[i - 1][w];//当前背包的容量装不下第i个。
else {
dp[i][w] = max(dp[i - 1][w - wt[i - 1]] + val[i - 1], dp[i - 1][w]);
} //装入或者不装入背包,择优。
}
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <=W; j++) {
System.out.print(dp[i][j] + "\t");
}
System.out.println();
}
return dp[N][W];
}
}
/*
0 0 0 6 6 6 6 6 6 6 6 6
0 4 4 6 6 10 10 10 10 10 10 10
0 4 8 8 12 12 14 14 18 18 18 18
0 4 8 8 12 12 14 14 18 18 21 21
0 4 8 8 12 12 14 18 18 22 22 24
0 4 8 8 12 12 14 18 18 22 22 24
24
*/