背包问题 动态规划
01背包
有n个重量和价值分别为wi,vi的物品,从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。
1≤n≤100
1≤wi,vi≤100
1≤W≤10000
输入:
n=4
(w,v)={(2,3),(1,2),(3,4),(2,2)}
W=5
输出:
7(选择第0,1,3号物品)
因为对每个物品只有选和不选两种情况,所以这个问题称为01背包。
分析
public class 背包问题_dp {
static int[] w = { 2, 1, 3, 2 };
static int[] v = { 3, 2, 4, 2 };
public static void main(String[] args) {
int[][] dp = new int[4][6];
dp(dp,5);
System.out.println(dp[3][5]);
}
static void dp(int[][] dp, int n) {
//初始化第一行
for (int i = 0; i < n +1 ; i++) {
//这里i是列,代表容量
if (i < w[0]) {//装不下
dp[0][i] = 0;
} else {//装下容量为w[0]
dp[0][i] = v[0];
}
}
for(int i = 1; i < 4; i++) {
for(int j = 1; j <n+1 ; j++) {
if(j<w[i]) {//代表当前背包容量装不下
dp[i][j]=dp[i-1][j];
}
else {
int x1=v[i]+dp[i-1][j-w[i]];//选择了第i行,再选择把i行容量去掉的货物j-w[i];
int x2=dp[i-1][j];//没选择i行
dp[i][j]=Math.max(x1, x2);//比较
}
}
}
}
}