题目:有3个物品,放入一个重量为10的背包,3个物品的重量分别是3,4,5。价值分别是4,5,6。请问如何放置,使背包的价值最大。
dp[i][j]=max{dp[i-1][j],dp[i-1][j-w[i]]+p[i]},dp[i][j]表示前i个物品放到重量为j的背包里面的最大价值。(0<i<=3,0<j<=10)
代码如下:
public class 背包问题 {
/*
* dp[i][j]=max{dp[i-1][j],dp[i-1][j-w[i]]+p[i]}
*/
public static void main(String[] args){
int n=3;
int m=10;
int[] w={3,4,5};
int[] p={4,5,6};
System.out.println(max(n,m,w,p));
}
public static int max(int n,int m,int[] w,int[] p){
int[][] dp=new int[n+1][m+1];
for(int i=0;i<=n;i++){
dp[i][0]=0;
}
for(int j=0;j<=m;j++){
dp[0][j]=0;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(j-w[i-1]>=0){
dp[i][j]=Math.max(dp[i-1][j], dp[i-1][j-w[i-1]]+p[i-1]);
}else{
dp[i][j]=dp[i-1][j];
}
}
}
return dp[n][m];
}
}