01背包问题改进算法

  • 格式:pdf
  • 大小:201.42 KB
  • 文档页数:6

0/1背包问题改进算法

改进算法的求解步骤: ① 初始[1]{(0,0)}pn;

② [1][1](,)iiqipiwv;

③ [][1][1]pipiqi ——其中的受控点;

④ 重复②③,直到计算出[1]p;

⑤ 由[1]p的最后一个跳跃点即为所求问题的最优值(1,)mc。

capacity value next p[1]

p[2]

p[3]

p[4]

p[5]

p[6]

int knapsack( int n, int c, int v[], int w[],pointer p[], int x[] )

{ p[1]=(pointer)malloc(sizeof(struct node));

p[1]capacity=-1;

p[1]value=-1;

p[1]next=null;

for( i=2; i<=n+1; i+= )

{ p[i]=(pointer)malloc(sizeof(struct node));

p[i]capacity=-1;

p[i]value=-1;

p[i]next=null; -1

-1

-1

-1

-1

-1 4 6  0 0

q[i]=(pointer)malloc(sizeof(struct node));

q[i]capacity=-1;

q[i]value=-1;

q[i]next=null;

}

s=(pointer)malloc(sizeof(struct node));

scapacity=0;

svalue=0;

snext=null;

p[n+1]next=s; //初始化p[n+1]={(0,0)}

//输出p[n+1]的信息 cout<

rp=p[n+1] next;

while( rp!=null ) { cout<<”(”<

rp=rpnext;

}

for( i=n; i>=1; i-- )

{ lp=p[i+1] next;

rq=q[i+1];

while( lp!=null )

{ if(lpcapacity+w[i]<=c)

{ s=(pointer)malloc(sizeof(struct node));

scapacity=lpcapacity+w[i];

svalue=lpvalue+v[i];

rqnext=s;

rq=s;

}

lp=lpnext;

}

rqnext=null;

//输出q[i+1]的信息 cout<

rq=q[i+1] next;

while( rq!=null ) { cout<<”(”<

rq=rqnext;

}

lp=p[i+1] next;

lq=q[i+1] next;

rp=p[i];

while( lp!=null&&lq!=null )

{ s=(pointer)malloc(sizeof(struct node));

if( lpcapacity

{ if( lpvalue>rpvalue ) //同时去除受控点

{ scapacity=lpcapacity;

svalue=lpvalue;

rpnext=s;

rp= rpnext;

}

lp=lpnext;

}

else if(lqcapacity

{ if( lqvalue>rpvalue ) //去除受控点

{ scapacity=lqcapacity;

svalue=lqvalue;

rpnext=s;

rp= rpnext;

}

lq=lqnext;

}

else //证明lpcapacity==lqcapacity

{ if( lpvalue>lqvalue ) //包容量相等 选价值大的

{ if( lpvalue>rpvalue ) //去除受控点

{ scapacity=lpcapacity;

svalue=lpvalue;

rpnext=s;

rp= rpnext;

}

lp=lpnext;

}

else

{ if( lqvalue>rpvalue ) //去除受控点

{ scapacity=lqcapacity;

svalue=lqvalue;

rpnext=s;

rp= rpnext;

}

lq=lqnext;

}

}

}

while( lp!=null )

{ s=()malloc();

if( lpvalue>rpvalue )

{ scapacity=lpcapacity;

svalue=lpvalue;

rpnext=s;

rp= rpnext;

}

lp=lpnext;

}

while( lq!=null )

{ s=()malloc();

if( lqvalue>rpvalue )

{ scapacity=lqcapacity;

svalue=lqvalue;

rpnext=s;

rp= rpnext;

}

lq=lqnext;

}

rpnext=null;

//在p[1]中求出最优解,最优值的最后一个结点capacity和value的值

pre=p[1] next;

rp=prenext;

for( i=1; i<=n; i++ )

{ x[i]=0;tag=1; rp=prenext;

while( rp!=null&&tag==1 )

if( precapacity+w[i]==rpcapacity&&prevalue+v[i]==rpvalue )

{ x[i]=1;

pre=rp;rp=rpnext;tag=0;

}

else rp=rpnext;

}

}