您的位置:首页 > 其它

动态规划实现0-1背包问题

2018-12-09 14:29 120 查看
//动态规划实现0-1背包
public class DN01 {
public static void dy(int []v,int []w,int c,int [][]m){
int n=v.length-1;
//i=n
int jMax=Math.min(w
-1, c);
for(int j=0;j<=jMax;j++) {
m
[j]=0;
}
for(int j=w
;j<=c;j++) {
m
[j]=v
;
}
//i从n-1到1
for(int i=n-1;i>=1;i--) {
jMax=Math.min(w[i]-1, c);
for(int j=0;j<=jMax;j++) {
m[i][j]=m[i+1][j];
}
for(int j=w[i];j<=c;j++) {
m[i][j]= Math.max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
}
}
//也可以把i=1单独拿出来,这样减少了计算次数
/*m[1][c]=m[2][c];
if(c>=w[1]) {
m[1][c]= Math.max(m[1][c],m[2][c-w[1]]+v[1]);
}*/
}
public static void gh(int[][]m,int c,int x[],int []w) {
int n=w.length-1;
//i从1到n-1
for(int i=1;i<n;i++) {
if(m[i][c]==m[i+1][c]) {
x[i]=0;
}
else
{
x[i]=1;
c=c-w[i];
}
}
//i=n
x
=(m
[c]>0)?1:0;
}
public static void main(String[] args) {
int []w= {3,4,5,2};     //存各个物品重量
int []v= {7,9,9,2};     //存各个物品价值
int n=v.length-1;
int c=6;     //背包容量
int m[][] = new int[n+1][c+1];    //m[i][j]表示当背包容量为j,可选物品为i,i+1,,,n时的问题最优值
dy(v,w,c,m);
int []x=new int[n+1];
gh(m,c,x,w);
int sum=0;
for(int i=1;i<=n;i++) {
sum=sum+x[i]*v[i];
}
System.out.println(sum);
}
}
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: