C 背包问题课程设计.docx

上传人:b****6 文档编号:6227626 上传时间:2023-01-04 格式:DOCX 页数:9 大小:15.61KB
下载 相关 举报
C 背包问题课程设计.docx_第1页
第1页 / 共9页
C 背包问题课程设计.docx_第2页
第2页 / 共9页
C 背包问题课程设计.docx_第3页
第3页 / 共9页
C 背包问题课程设计.docx_第4页
第4页 / 共9页
C 背包问题课程设计.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

C 背包问题课程设计.docx

《C 背包问题课程设计.docx》由会员分享,可在线阅读,更多相关《C 背包问题课程设计.docx(9页珍藏版)》请在冰豆网上搜索。

C 背包问题课程设计.docx

C背包问题课程设计

 

 

//思想——动态规划法,先考虑没有物品要放的时候S0,

//再考虑只有一个要放物品a的各种情况S1,

//再综合考虑只有第一个a和第二个b物品要放时的情况S2,

//再综合考虑有三个待放物品abc的情况……

 

#include

#include

#defineMAX200

intn,M;

intnum,t,q;

inttemp;

ints[100];

intx[100];//决策集

intww,pp,i,j,k,r,next;

intu;//记录附加结点

intP[100000],W[100000];//存放所有的可行序偶

//什么叫序偶?

答:

序偶可以看作两个元素的集合,但序偶具有次序关系.如

//!

=.集合中{x,y}={y,x}

 

intF[100];//记录si点的起点在P[]、W[]数组中的位置

intbegin=0,end=0;

intwi[100],pi[100],w[100],p[100];

intPX,WX,PY,WY;

voidmain(void)

{

printf("\n******************************************************");

printf("\n*******************背包问题***************");

printf("\n******************************************************");

P[0]=W[0]=0;//S0中的点(0,0)

F[0]=0;

F[1]=next=1;

printf("\n请输入下列背包初始信息:

");

printf("\n背包最大容量为:

");

scanf("%d",&M);

printf("\n请输入下列物品初始信息:

");

printf("\n物品种类有几种?

");

scanf("%d",&n);

for(num=0;num

{

printf("\n第%d种物品重量:

",num+1);

scanf("%d",&wi[num]);

printf("\n价值:

");

scanf("%d",&pi[num]);

}

 

for(num=0;num

{

temp=wi[0];

q=0;

for(t=0;t

{

if(temp>wi[t])

{

temp=wi[t];

q=t;

}

}//寻找最小质量的物品,并用q记录其位置

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;

}

//回溯

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];

}

elsex[i]=0;

}

printf("\n最优决策为:

");

for(i=0;i

printf("%d",x[s[i]]);

printf("\n最优效益为:

%d",P[end]);

printf("\n最优重量为:

%d",W[end]);

}

 

 

 

 

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1