#include#include#defineMAX500voidmain(void){cout<
#include
#include
#define MAX 500
void main(void)
{
cout<
<
<
<
<
int n,M; M //M为背包最大容量,n为物品的种类
int num,t,q; //num为物品编号
int temp;
int s[100];
int x[100];//决策集
int ww,pp,i,j,k,r,next;
int u;//记录附加结点
int P[100000],W[100000];//存放所有的可行序偶
P[0]=W[0]=0;//S0中的点(0,0)
int F[100];//记录si点的起点在P[]W[]数组中的位置
F[0]=0;F[1]=next=1;
int begin,end;begin=end=0;
int wi[100],pi[100],w[100],p[100];
cout<
cout<
cin>>M;
cout<
cout<
cin>>n;
for(num=0;num
{
cout<
cin>>wi[num];
cout<
cin>>pi[num];
}
for(num=0;num
{
temp=wi[0];
q=0;
for(t=0;t
{
if(temp>wi[t])
{
temp=wi[t];
q=t;
}
}
s[q]=num+1;
w[num]=wi[q];
p[num]=pi[q];
wi[q]=MAX;
}
for(i=0;i
{
F[i+1]=end+1;
u=begin;//从头开始考虑序偶点
for(r=begin;r
{
if(W[r]+w[i]<=M)
u=(W[r]+w[i])>(W[u]+w[i])?r:u;//s1的u=0,u是sii中能让i结点加上它把空间塞得最满的那个结点,即
//造成s12中x轴最向右靠近确定的M值的点的附加点
}//u号以前的点都是可以考虑加入的点
k=begin;//k是记录si-1图中已加入到si图中的点
for(j=begin;j
{
ww=W[j]+w[i];
pp=P[j]+p[i];
while(k<=end&&W[k]
{
P[next]=P[k];
W[next]=W[k];
next++;k++;
}
if(k<=end&&W[k]==ww)
{
pp=pp>P[k]?pp:P[k];
k++;
}
if(pp>P[next-1])//sii中的点如果效益比以前的大,加进si
{
P[next]=pp;
W[next]=ww;
next++;
}
while(k<=end&&P[k]<=P[next-1])
k++;
}
begin=end+1;
end=next-1;
}
//回溯
int PX,WX,PY,WY;
PX=P[end];WX=W[end];
for(i=n;i>0;i--)
{
PY=P[F[i]-1];WY=W[F[i]-1];
if(PX>PY)
{
x[i]=1;
PX=PX-p[i-1];WX=PY-w[i-1];
}
else x[i]=0;
}
cout<
for(i=0;i
cout<
cout<
}
这是在网上找的高手做的正确无误的完整背包问题动态规划的程序,但里面的注释有些比较专业看的不大懂,哪位高手能详细帮我剖析一下这个代码的每个变量所代表的意义和总体的思路?多谢,越详细越好,加分哦1!
展开