前言:第一次接触状态转移方程,鸡冻!
目录
问题:
假设山洞里共有a,b,c,d,e这5件宝物(不是5种宝物),它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包,
怎么装背包,可以才能带走最多的财富
。
算法原理
状态转移方程 dp[i,j]=max{dp[i-1,j-wi],dp[i-1,j]}
dp[i,j] 把前i件物品 放在承重为j的包中 最大获益值
dp[i-1,j-wi] 把前i-1件物品 放在承重为j-wi的包中 最大获益值+Vi(考虑本件物品已经被放进来了,所以减去)
dp[i-1,j] 把前i-1件物品 放在承重为j的包中 最大获益值(考虑,不放进本件物品,放进其他物品,或者是什么也不再放)
代码:(暂时有点小问题)
public class backpack {
int m=4;
/*A:weight 数组
// V:value 这里V=weight
m是包的承重量
*/
public void bp(int[] W,int[] V,int n,int m)
{
int[][] dp = new int[n][m+1];
for (int j = 0; j < m+1; j++) {
for (int i = n-1; i >0; i--) {
if (j >= W[i]) {
dp[i][j] = Math.max(dp[i-1][j - W[i]] + V[i], dp[i- 1][j]);
}
}
}
//输出
for(int k=0;k<n;k++) {
for (int kk = 0; kk < m; kk++) {
System.out.printf("%4d", dp[k][kk]);
}
System.out.println("");
}
}
public static void main(String[] args) {
int []V={7,5,3,2};
int W[]={7,5,3,2};
int m=11;
int n=4;
backpack a=new backpack();
a.bp(W,V,n,m);
}
}
参考文献
https://blog.csdn.net/mu399/article/details/7722810
https://blog.csdn.net/Thousa_Ho/article/details/78156678