0/1背包问题。

vivian08 2005-02-25 02:43:12
用Dynamic Programming怎么解阿?我写了一个觉得是错的。
从网上找了一格代码,发现写的很奇怪。台湾人写的,不好意思问。

我知道用2个循环的
比如
2个数组,1个是重量w[],1个是价格的v[]
在用一个2d的数组val
我还知道
val[i,j]=max(v[i-1,j],v[i-1,j-w[i]]+v[i]);

谁能给我一个能运行得代码阿?
为什么我写的总是说我的数组有问题呢?
...全文
71 点赞 收藏 3
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
myth822 2005-02-25
public class PackageQuestion {

public static void knapsack(int[] v, int[] w, int c, int[][] m)
{/** v[] w[] c 分?是价?、重量、和背包容量数?m[i][j]表示有i~n个物品,背包容量?j的最大价?。*/
int n = v.length-1;
int jMax = Math.min(w[n]-1, c);
for(int j = 0; j <= jMax; j++)

m[n][j] = 0; //当w[n]>j 有 m[n][j]=0
//m[n][j] 表示只有n物品,背包的容量?j?的最大价?
for (int l = w[n]; l <= c; l++)
m[n][l] = v[n]; //当w[n]<j 有m[n][j]=v[n]
//???用求出m[[]其他直,直到求出m[0][c]
for(int i = n-1; i >=1; i--)
{
jMax = Math.min(w[i]-1,c);

for(int k = 0; k <=jMax; k++)
m[i][k] = m[i+1][k];

for(int h = w[i]; h <= c; h++)
m[i][h] = Math.max(m[i+1][h],m[i+1][h-w[i]]+v[i]);
}
m[0][c] = m[1][c];
if(c >= w[0])
m[0][c] = Math.max(m[0][c],m[1][c-w[0]]+v[0]);
System.out.println("bestw ="+m[0][c]);
}

public static void traceback(int[][] m, int[] w, int c, int[] x)
{// 根据最??求出最?解
int n = w.length-1;
for(int i = 0; i<n;i++)
if(m[i][c] == m[i+1][c]) x[i] = 0;
else {x[i] = 1;
c -= w[i];}

x[n] = (m[n][c]>0)?1:0;}
public static void main(String[] args)
{//??
long start, end;
start = System.currentTimeMillis();
int[] ww = {2,2,6,5,4};
int[] vv = {6,3,5,4,6};
int[][] mm = new int[200][200];
knapsack(vv,ww,10,mm);

int[] xx =new int[ww.length];
traceback(mm,ww,10,xx);
for(int i = 0;i<xx.length;i++)
{
System.out.println(xx[i]);

}
end = System.currentTimeMillis();
System.out.println(end-start);
}
}
回复
vivian08 2005-02-25
我知道是错的,可是怎么改呢?
回复
vivian08 2005-02-25

public class b
{
public static void main(String[] args)
{
int[] w = {1,2,3,4,5};//重量
int[] v = {1,6,18,22,28};//价格
int[][] total = new int [4][11];//总的价格

for (int i=0;i<4;i++)
total[0][i]=0;//第一列为0

for (int i=1;i<4;i++)
{
for (int j=0;j<11;j++)
{
total[i][j]=total[i-1][j];
if ((total[i-1][j-w[i]]+v[i])>(total[i-1][j]))
total[i][j]=total[i-1][j-w[i]]+v[i];







}}








}}
回复
相关推荐
发帖
Java EE
创建于2007-09-28

6.6w+

社区成员

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
申请成为版主
帖子事件
创建了帖子
2005-02-25 02:43
社区公告
暂无公告