dd大牛的背包九讲 pdf下载_背包问题求解疑问 c++

#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!

展开

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值