/**
* 单副本背包问题
*/
public class Knapsack {
/**
* 计算背包问题的二维表格
* @param W 背包可容纳的最大重量
* @param n 物品数量
* @param K 二维表格
* @param wv wv[i][0]=w(该物品的重量) , wv[i][1]=v(该物品的价值) , 0<=i<=n
*/
public int[][] getArray(int W, int n, int wv[][]){
//第一行和第一列的所有值为0
int[][] K = new int[W+1][n+1];
//核心代码的实现,参照伪代码
for(int j=1; j<=n; j++){
for(int w=1; w<=W; w++){
int maxW = wv[j-1][0];
if(maxW>w){
K[w][j] = K[w][j-1];
}else{
K[w][j] = max(K[w][j - 1],K[w - maxW][j - 1]+wv[j - 1][1]);
}
}
}
return K;
}
public int max(int a, int b){
return a>b ? a : b;
}
/**
* 计算放入背包中的物品总质量和哪些物品放到背包中
* @param wv wv[i][0]=w(该物品的重量) , wv[i][1]=v(该物品的价值) , 0<=i<=n
* @param K 存储背包问题的二维数组
* @param W 背包可容纳的最大重量
* @param n 物品数量
* @return isTaked[] 第一个位置放
*/
public static int[] getIsTaked(int[][] wv,int[][] K,int W,int n){
/* 下标为0的数组值存储放到背包里的物品总价值
从下标1开始记录该物品编号是否放入背包中(下标即为物品的编号),
1是放入,0是不放入 */
int isTaked[]=new int[n+1];
int w = W;
for(int j=n;j>0;j--){
if(K[w][j]>K[w][j-1]){
isTaked[j]=1;
w = w - wv[j-1][0];
if(w<0) break;
}
}
//计算放入背包的物品总重量
int sumW=0;
for(int j=1;j<=n;j++){
if(isTaked[j]==1){
sumW+=wv[j-1][0];
}
}
isTaked[0] = sumW;
return isTaked;
}
}
第七周作业--背包问题
最新推荐文章于 2019-11-05 10:28:01 发布