您的位置:首页 > 其它

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

2015-08-17 20:33 295 查看
简述问题:给定n中物品和1个背包,物品i的重量wi,价值为vi,背包容量为C,问如何选择背入背包,使得包内总价值最大。此问题通过数学表达为:求



可以得到递归关系,(动态规划中,最重要的就是得到递归关系)



算法实现:
public static void knapsack(int []v,int []w,int c,int [][]m)
{
int n = v.length();
int Jmax = Math.min(c,w
-1);
for(int i=0;i<=Jmax;i++)
m
[i] = 0;
for(i = w
,i<=c;i++)
m
[i] = v
;
for(i = n-1;i>1;i--)
{
Jmax = Math.min(c,w[i]-1);
for(j = 0;j<=Jmax,j++)
m[i][j] = 0;
for(j = w[i];j<=c;j++)
m[i][j] = Math.max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
}
m[1][c] = m[2][c];
if(c >= w[1])
m[1][c] = Math.max(m[2][c],m[2][c-w[1]]+v[1]);
}

public static void traceback(int [][]m,int []w,int []v,int []x,int c)
{
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];
}
}
x
= m
[c]>0?1:0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: