收藏 分销(赏)

C 背包问题课程设计.doc

上传人:pc****0 文档编号:7181834 上传时间:2024-12-27 格式:DOC 页数:4 大小:27.50KB 下载积分:10 金币
下载 相关 举报
C 背包问题课程设计.doc_第1页
第1页 / 共4页
C 背包问题课程设计.doc_第2页
第2页 / 共4页


点击查看更多>>
资源描述
//解决“背包问题”的思路及思想如下: //思想——动态规划法,先考虑没有物品要放的时候S0, //再考虑只有一个要放物品a的各种情况S1, //再综合考虑只有第一个a和第二个b物品要放时的情况S2, //再综合考虑有三个待放物品abc的情况…… #include<stdio.h> #include<math.h> #define MAX 200 int n,M; int num,t,q; int temp; int s[100]; int x[100];//决策集 int ww,pp,i,j,k,r,next; int u;//记录附加结点 int P[100000],W[100000];//存放所有的可行序偶 //什么叫序偶?答:序偶可以看作两个元素的集合,但序偶具有次序关系 .如 //<x,y>!=<y,x>.集合中{x,y}={y,x} int F[100];//记录si点的起点在P[]、W[]数组中的位置 int begin=0,end=0; int wi[100],pi[100],w[100],p[100]; int PX,WX,PY,WY; void main(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<n;num++) { printf("\n第%d种物品重量:",num+1); scanf("%d",&wi[num]); printf("\n 价值:"); scanf("%d",&pi[num]); } for(num=0;num<n;num++) { temp=wi[0]; q=0; for(t=0;t<n;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<n;i++) { F[i+1]=end+1; u=begin;//从头开始考虑序偶点 for(r=begin;r<end+1;r++)//生成sii图,s1中只考察结点0, { 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<u+1;j++)//生成si图 { ww=W[j]+w[i]; pp=P[j]+p[i]; while(k<=end&&W[k]<ww)//将si-1的点都加到si中 { 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]; } else x[i]=0; } printf("\n最优决策为:"); for(i=0;i<n;i++) printf("%d",x[s[i]]); printf("\n最优效益为:%d",P[end]); printf("\n最优重量为:%d",W[end]); }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服