C 背包问题课程设计.docx
《C 背包问题课程设计.docx》由会员分享,可在线阅读,更多相关《C 背包问题课程设计.docx(9页珍藏版)》请在冰豆网上搜索。
![C 背包问题课程设计.docx](https://file1.bdocx.com/fileroot1/2023-1/4/6025848c-4d5d-417a-8fe3-7ddf736489ae/6025848c-4d5d-417a-8fe3-7ddf736489ae1.gif)
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;iprintf("%d",x[s[i]]);
printf("\n最优效益为:
%d",P[end]);
printf("\n最优重量为:
%d",W[end]);
}