您的位置:首页 > 编程语言 > Java开发

01背包动态规划-java源码

2016-05-31 14:11 399 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010996555/article/details/51545292

算法设计与分析中的01背包问题是学习动态规划的经典问题,这里是该算法的Java实现,(我就不讲算法了,适合了解算法但是编程不太熟练的童鞋看)话不多说,直接上代码吧!

<span style="font-size:24px;">package Algorithms;

public class Bag01 {

public static void main(String[] args) {
int s;//获得的最大价值
int w[]={1,2,3,4,5,3,6,8,2,8,1,4,6,4,7};//物品的重量
int v[]={5,8,9,20,20,3,12,8,4,8,3,44,36,4,7};//物品的价值
int x[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//物品的选取状态 0/1
int n,i;
int C=50;//背包最大容量
n=15;//  物品数
s=KnapSack(n,w,v,x,C);
System.out.println("最大物品价值为:");
System.out.println(s);

}
static int V[][] = new int[100][100];   //前i个物品装入容量为j的背包中获得的最大价值
public static int max(int a,int b)
{
if(a>=b)
return a;
else return b;
}

public static int KnapSack(int n,int w[],int v[],int x[],int C)
{
int i,j;
for(i=0;i<=n;i++)
V[i][0]=0;
for(j=0;j<=C;j++)
V[0][j]=0;
for(i=1;i<=n-1;i++)  //i=0
for(j=0;j<=C;j++)
if(j<w[i])
V[i][j]=V[i-1][j];
else
V[i][j]=max(V[i-1][j],V[i-1][j-w[i]]+v[i]);
j=C;
for(i=n-1;i>0;i--)  //i>=0
{
if(V[i][j]>V[i-1][j])
{
x[i]=1;
j=j-w[i];
}
else
x[i]=0;
}
System.out.print("选中的物品是:\n");
for(i=0;i<n;i++)
System.out.print(x[i]);
System.out.println();
return V[n-1][C];

}

}</span><span style="font-size:32px;">
</span>
代码不长,各变量的含义注释里也都有,如果你想看动态规划的结果记录矩阵的话,
for(int i=0;i<100;i++){
for(int j=0;j<100;j++){
System.out.print(V[i][j]);
}
System.out.println();
}
Y(^o^)Y好了,就这样吧。 PS:转载请注明出处,作者xingsha,谢谢合作!(~ ̄▽ ̄)~


阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: