问答题

[说明]
背包问题就是有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,而且选中物品的价值之和为最大。
背包问题是一个典型的NP完全难题。对该问题求解方法的研究无论是在理论上,还是在实践中都具有一定的意义。如管理中的资源分配、投资决策、装载问题等均可建模为背包问题。
常用的背包问题求解方法很多,但本题中采用了一种新的算法来求解背包问题。该算法思想为:首先要对物品进行价重比排序,然后按价重比从大到小依次装进包裹。这种方法并不能找到最佳的方案,因为有某些特殊情况存在,但只要把包中重量最大的物品取出,继续装入,直到达到limitweight,这时的物品就是limit weight的最大价值。这种算法不需要逐个进行试探,所以在数据非常大时,执行效率主要由排序的时间复杂度决定。该算法的流程图为下图。
仔细阅读程序说明和C程序流程图及源码,回答问题1和问题2。
[流程图]






[程序说明]
struct Thing:物品结构
typedef struct Bag:背包结构类型
input ( ):将物品按序号依次存入数组函数
inbag ( ):物品按物价比入包函数
init ( ):初始化函数
sort ( ):对物品按价格重量比排序函数
outbag ( ):取出包中weiht最大的物品函数
print ( ):最佳方案输出函数
[C程序]
#define N 255
struct Thing
double weight;
double value;
double dens;
thing[N];
typedef stmct Bag
Thing thing [N];
double weighttmp;
double sumvalue;
bag,best;
inbag ( )

do
bag.thing[i]=thing[i]
(1)
(2)
i++;
while ( (3) )

init ( )

for (inti=0; i<N; i++)

input (thing[i].weight, thing [i].value)
thing [i].dens=thing[i].value/thing [i].weight;
;

main ( )

init ( );
sort ( );
inbag ( );
do
best=bag; //把包中物品放入暂存数组
outbag ( ); //取出包中weight最大的物品
(4)
while ( (5) )
print (best); //输出temp因为是最佳方案

[问题1]
根据程序说明及流程图、部分C源码,充分理解算法思想,填入 (n) 处。

【参考答案】

bag.weighttmp=bag.weighttmp+thing[i].weight;
(2)bag.sum......

(↓↓↓ 点击下方‘点击查看答案’看完整答案、解析 ↓↓↓)
热门 试题

问答题
【说明】设某城市有n个车站,并有m条公交线路连接这些车站,设这些公交车都是单向的,这n个车站被顺序编号为0至n-1。本程序,输入该城市的公交线路数、车站个数,以及各公交线路上的各站编号,求得从站0出发乘公交车至站n-1的最少换车次数。 程序利用输入信息构建一张有向图G(用邻接矩阵g表示),有向图的顶点是车站,若有某条公交线路经i站到达j站,就在顶点i到顶点j之间设置一条权为1的有向边<i,j>。如果这样,从站点x至站点y的最少上车次数便对应图G中从点x到点y的最短路径长度。而程序要求的换车次数就是上车次数减1。 #include <stdio.h> #define M 20 #define N 50 int a[N+1]; *用于存放一条线路上的各站编号* int g[N][N]; *严存储对应的邻接矩阵* int dist[N]; *严存储站0到各站的最短路径* int m, n; void buildG() int i, j, k, sc, dd printf(“输入公交线路数,公交站数 n”); scanf( %d%d ,&m,&n); for (i=0;i<n;i++) *邻接矩阵清0* for(j=0;j<n;j++) g[i][j]=0; for(i=0;i<m;i++) printf( 沿第%d条公交线路的各站编号(0<=编号<=%d,-1结束): n) ,i+1,n-1); sc=0; * 当前线路站计数器* while(1) scanf( %d ,&dd); if(dd=-1)break; if(dd>=0 && dd<n) (1) ; a[sc]=-1; for(k=1;a[k]>=0;k++) *处理第i+1条公交线路* for(j=0;j<k;j++) g (2) =1; int minLen() int j,k; for(j=0;j<n;j++) dist[j]=g[0][j]; dist[0]=1; do for(k=-1,j=0;j<n;j++) *找下一个最少上车次数的站* if(dist[j]>0 &&(k==-1||dist[j]<dist[k])) k=j; if(k<0||k==n-1) break; dist[k]=-dist[k]; *设置k站已求得上车次数的标记* for (j=1;j<n;j++) *调整经过k站能到达的其余各站的上车次数* if( (3) && (dist[j]=0||-dist[k]+1<dist[j])) dist[j]= (4) ; while(1); j=dist[n-1]; return (5) ;void main() int t; buildG(); if((t=minLen())<0) printf( 无解! n );else printf(“从0号站到%d站需换车%d次 n”,n-1,t);