01背包问题改进算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

0/1背包问题改进算法
改进算法的求解步骤:
① 初始[1]{(0,0)}p n +=;
② [1][1](,)i i q i p i w v +=+⊕;
③ [][1][1]p i p i q i =++ ——其中的受控点;
④ 重复②③,直到计算出[1]p ;
⑤ 由[1]p 的最后一个跳跃点即为所求问题的最优值(1,)m c 。

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;
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<<endl<<”p[”<<n+1<<”]:”;
rp=p[n+1] →next;
while( rp!=null )
{ cout<<”(”<<rp→capacity <<”,”<<rp→value<<”)”; 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;
}
}
rq→next=null;
//输出q[i+1]的信息
cout<<endl<<”q[”<<i+1<<”]:”;
rq=q[i+1] →next;
while( rq!=null )
{ cout<<”(”<<rq→capacity <<”,”<<rq→value<<”)”;
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<lq→capacity ) //p[i]中元素按包的容量升序排 { 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<lp→capacity )
{ if( lq→value>rp→value ) //去除受控点
{ s→capacity=lq→capacity;
s→value=lq→value;
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; }
}。

相关文档
最新文档