背包问题的dp方程(动规)
/*
有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背包。
*/
package _9动规;
public class _01背包问题的dp方程 {
static int[] w = {2, 1, 3, 2};//重量表
static int[] v = {3, 2, 4, 2};//价值表
static int n = 4;//物品数量
static int W = 5;//背包的承重极限
public static void main(String[] args) {
int res=dp();
System.out.println(res);
}
private static int dp() {
int [][]dp=new int [n][W+1];
//初始化dp表 的第一行
for(int i=0;i<W+1;i++) {
if(i>=w[0]) {//给个的重量
dp[0][i]=v[0];//每一种容量
}else {
dp[0][i]=0;
}
}
//其它行
for(int i=1;i<n;i++) {
for(int j=0;j<W+1;j++) {
if(j>=w[i]) {
int i1=v[i]+dp[i-1][j-w[i]];//选择当前物品及i号物品,剩余容量
int i2=dp[i-1][j];
dp[i][j]=Math.max(i1, i2);
}else {
dp[i][j]=dp[i-1][j];//好像是返回上面存下来的最大值
}
}
}
return dp[n-1][W];
}
}