多重背包问题-----------Java
问题描述: 有M种物品和一个容量为N的背包。第m种物品最多有con_mum[i]件可用,每件价值是con_value[i],容量是con[i]。如何装载背包使得价值F(M,N)最大。
状态转移方程: F(M,N)=MAX(F(M-1,N),…,F(M-1,N-con[i]*j)+con_value[i]*j)
代码如下: 代码错误或者可优化之处请指正。
public int waysTo_MAX_VALUE(int n){
int[] con={0,1,5,15,25}; //4种货物,假设使用0种货物其容量、数量、价值为0
int[] con_value={0,1,6,20,34};
int[] con_num={0,2,1,4,5};
int[] dq=new int[n+1];
int[] dq_n=new int[n+1];
List<Integer> c=new ArrayList();
int maxx=0;
dq[0]=0; //容量为0时价值为0
dq_n[0]=con_num[0];
for(int i=1;i<con.length;i++){
for(int l=0;l<n;l++){
dq_n[l]=con_num[i]; //初始化 每种货物初始的使用个数
}
maxx+=con_num[i]*con_value[i]; //前i种货物最大容量
for(int j=con[i];j<=n;j++) {
c.clear();
for (int k = 0; k <= j / con[i]; k++) {
if (k <= dq_n[j - con[i] * k]) {
c.add(dq[j - con[i] * k] + con_value[i] * k);
}
}
dq[j] = Collections.max(c);
dq_n[j] = dq_n[j - c.indexOf(Collections.max(c)) * con[i]] - c.indexOf(Collections.max(c));
if (j - maxx >0){ //当背包容量大于当前货物的最大容量时,剩余容量为多余容量,不用计算
dq[j]=dq[j-1];
}
}
}
return dq[n];
}