重要提示: 请勿将账号共享给其他人使用,违者账号将被封禁!
查看《购买须知》>>>
找答案首页 > 全部分类 > 计算机类考试
搜题
网友您好, 请在下方输入框内输入要搜索的题目:
搜题
题目内容 (请给出正确答案)
[主观题]

0-1背包问题可以描述为:有n个物品,对i=1,2,…,n,第i个物品价值为vi ,重量为wi(vi,和wi为非负数),

0-1背包问题可以描述为:有n个物品,对i=1,2,…,n,第i个物品价值为vi ,重量为wi(vi,和wi为非负数),背包容量为W(W为非负数),选择其中一些物品装入背包,使装入背包物品的总价值最大,0-1背包问题可以描述为:有n个物品,对i=1,2,…,n,第i个物品价值为vi ,重量为wi(vi,且总重量不超过背包容量,即0-1背包问题可以描述为:有n个物品,对i=1,2,…,n,第i个物品价值为vi ,重量为wi(vi,其中,xi∈{0,1},xi=0表示第i个物品不放入背包,xi=1表示第i个物品 放入背包。

【问题1】(8分)

用回溯法求解此0-1背包问题,请填充下面伪代码中(1)~(4)处空缺。

回溯法是一种系统的搜索方法。在确定解空间后,回溯法从根结点开始,按照深度优先策略遍历解空间树,搜索满足约束条件的解。对每一个当前结点,若扩展该结点己经不满足约束条件,则不再继续扩展。为了进一步提高算法的搜索效率,往往需要设计一个限界函数,判断并剪枝那些即使扩展了也不能得到最优解的结点。现在假设已经设计了BOUND(v,w,k,W)函数,其中v, w, k和W分别表示当前已经获得的价值、当前背包的重量、己经确定是否选择的物品数和背包的总容量。对应于搜索树中的某个结点,该函数值表示确定了部分物品是否选择之后,对剩下的物品在满足约束条件的前提下进行选择可能获得的最大价值,若该价值小于等于当前已经得到的最优解,则该结点无需再扩展。

下面给出0-1背包问题的回溯算法伪代码。

函数参数说明如下:

W:背包容量;n:物品个数;w:重量数组;v:价值数组;fw:获得最大价值时背包的重量;fp:背包获得的最大价值;X:问题的最优解。

变量说明如下:

cw:当前的背包重量;cp:当前获得的价值;k:当前考虑的物品编号;Y:当前已获得的部分解。

BKNAP(W,n,w,v,fw,fp,X)

1 cw ← cp ← 0

2 (1)

3 fp ← -1

4 while true

5 while k≤n and cw+w[k]≤W do

6 (2)

7 cp ← cp+v[k]

8 Y[k]← 1

9 k ← k+1

10 if k>n then

11 if fp<cp then

12 fp ← cp

13 fw ← ew

14 k ← n

15 X ← Y

16 else Y(k)← 0

17 while BOUND(cp,cw,k,W) ≤fp do

18 while k≠0 and Y(k)≠1 do

19 (3)

20 if k=0 then return

21 Y[k]←0

22 cw ← cw ← w[k]

23 cp ← cp ← v[k]

24 (4)

查看答案
更多“0-1背包问题可以描述为:有n个物品,对i=1,2,…,n,第i个物品价值为vi ,重量为wi(vi,和wi为非负数),”相关的问题

第1题

选出正确的关系代数表达式。 查询所有“外科”病区和“内科”病区的所有医生姓名;A.σName="外科"∨Nam

选出正确的关系代数表达式。

查询所有“外科”病区和“内科”病区的所有医生姓名; A.σName="外科"∨Name="内科"(π4(Q))

B.σName="外科"∧Name="内科"(π4(Q))

C.π4(σName="外科"∨Name="内科"(Q))

D.π4(σName="外科"∧Name="内科"(Q))

点击查看答案

第2题

根据题意,指出加工1子图(图1-3A)中缺失的数据流的名称,并指出该数据流的起点和终点。

点击查看答案

第3题

指出数据流图4-1和数据流图4-2中错误的数据流。

点击查看答案

第4题

【说明】 某直达列车车票预售系统接受顾客的订票、取票和售票处工作人员的查询业务。 1.顾客为了提前

【说明】

某直达列车车票预售系统接受顾客的订票、取票和售票处工作人员的查询业务。

1.顾客为了提前订票,可向系统提供个人信息及其预订购的车次及日期,系统根据个人信息是否齐全以及车次是否正确来判断订票单是否合格。对于合格的订票单系统,如果相应的车次有剩余票,则记录顾客个人信息以及订票信息,并向顾客提供取票单。

2.到了可以取票的时间,顾客向系统提供取票单,在检查单据合格的情况下,系统向顾客提供火车票。

3.售票处的工作人员可以利用系统查询各车次车票的售票情况。

该直达列车车票预售系统的分层数据流图中部分数据流和文件的组成如下:

文件:

火车时刻表=车次+开车时间+到站时间+起始站+终点站+上铺票价+下铺票价

订票信息表=车次+车票日期+旅客身份证号+座位号+是否领票

旅客信息表=旅客身份证号+姓名+性别+联系电话

座位表=车次+座位号

数据流:

订票单=旅客姓名+性别+身份证号+联系电话+车次十车票日期

车票=车次+起始站生终点站+开车日期+开车时间+座位号+票价

假定顶层图是正确的,“火车时刻表”和“座位表”文件已由其他系统生成。

指出哪张图的哪个文件可以不必画出。

点击查看答案

第5题

将数据流图3(加工4的细化图)中的数据流补充完整,并指明加工名称、数据流的方向(输入/输出)和数据

流名称。

点击查看答案

第6题

阅读下列C程序和程序说明,将应填入(n)处的字句写在答题纸的对应栏内。【说明】用克鲁斯卡尔算法求解

阅读下列C程序和程序说明,将应填入(n)处的字句写在答题纸的对应栏内。

【说明】用克鲁斯卡尔算法求解给定图的最小生成树。

include <stdio. h>

include <stdlib. h>

define MAXN 30

typedef struct

{ int v1,v2; /*一条边依附的两个顶点*/

int weight; /*边上的权值*/

}EDGE;

typedef struct

{ int Vnum; /*图中的顶点数目*/

EDGE e[MAXN*(MAXN-1)/2]; /*图中的边*/

}Graph;

typedef struct node{ /*用链表存储同一个连通分量的顶点*/

int v;

struct node *next;

}Alist;

void heapadjust(EDGE data[], int s, int m)

{ /*将元素序列data[s..m]调整为小顶堆, 堆顶元素(最小元素)为data[s]*/

int j;

EDGE t;

t=data[s]; /*备份元素data[s], 为其找到适当位置后再插入*/

for(j=2*s+1; j<=m; j=j*2+1){/*沿值较小的子结点向下筛选*/

if(j<m &&(1)) ++j;

if(!(t. weight>data[j]. weight)) break;

data[s]=data[j];s=j; /*用s记录待插入元素的位置(下标)*/

}/*for*/

data[s]=t; /*将备份元素插入由s所指出的插入位置*/

}/*heapadjust*/

int creat_graph(Graph *p) /*输入图中的顶点及边, 返回图中边的数目*/

{ int k=0; /*记录图中边的数目*/

int n;

int v1,v2;

int w;

printf("vertex number of the graph:");

scanf("%d", &n); /*输入图中的顶点数目*/

if(n<1) return 0;

p->Vnum=n;

do{ printf("edge(vertex1,vertex2,weight):");

scanf("%d %d %d", &V1, &v2, &w);

if(v1>=0 && v1<n && v2>=0 && v2<n){

p->e[k]. v1=v1; p->e[k]. v2=v2; p->e[k]. weight=w;

k++;

}/*if*/

}while(!( (2) ));

return k; /*返回图中边的数目*/

}/*creat_graph*/

int kruskal(Graph G, int enumber, int tree[][3])

{ /*用kruskal算法求无向连通图G的最小生成树, 图中边所得数目为enumber, */

/*数组tree[][3]中存放生成树中边的顶点和边上的权值, 函数返回生成树的代价*/

int i, k, m, c=0;

int v1, v2;

Alist *p, *q, *a[MAXN];

for(i=0; i<G.Vnum; ++i){ /*将每个连通分量中的顶点存放在一个单链表中*/

a[i]=(Alist*)malloc(sizeof(Alist));

if(!a[i]) {

printf("\n mernory allocation error!");

exit(0);

}/*if*/

a[i]->v=i; a[i]->next=NULL;

}/*for*/

for(i=enumber-1; i>=0; --i)/*按照边上的权值建立小顶堆*/

heapadjust( (3) );

k=G. Vnum; /*k用于计算图中的连通分量数目*/

m=enumber-1;

i=0;

do{

v1=G. e[0]. v1; v2=G. e[0]. v2;

p=a[v1];

while(p && p->v!=v2){ /*判断当前选择的边的顶点是否在一个连通分量中*/

q=p; p=p->next;

}

if(!p){ /*当前边的顶点不在一个连通分量中*/

p=q;

p->next=a[G. e[0]. v2];

&nb

点击查看答案

第7题

比较时序图和协作图,说明区别和联系。

点击查看答案

第8题

阅读以下说明,回答问题1~2,将解答填入对应的解答栏内。[说明] 设某商业集团数据库中三个实体集。一

阅读以下说明,回答问题1~2,将解答填入对应的解答栏内。

[说明] 设某商业集团数据库中三个实体集。一是“仓库”实体集,属性有仓库号、仓库名和地址等;二是“商店”实体集,属性有商店号、商店名、地址等;三是“商品”实体集,属性有商品号、商品名、单价。

设仓库与商品之间存在“库存”联系,每个仓库可存储若干种商品,每种商品存储在若干仓库中,每个仓库每存储一种商品有个日期及存储量;商品与商品之间存在着“销售”联系,每个商品可销售若干种商品,每种商品可在若干商店里销售,每个商店销售一种商品有月份和月销售量两个属性;仓库、商店、商品之间存在着“供应”联系,有月份和月供应量两个属性。

试画出ER图,并在图上注明属性、联系类型、实体标识符;

点击查看答案

第9题

根据题意,将图(9-4)-(9-5)中的(1)~(5)处补充完整。

点击查看答案

第10题

阅读下列程序说明和C代码,将应填人(n)处的字句写在对应栏内。 [程序5说明] 下列文法可用来描述化

阅读下列程序说明和C代码,将应填人(n)处的字句写在对应栏内。

[程序5说明]

下列文法可用来描述化学分子式的书写规则(例如,A12(CO3)3”Cu(OH)2):

λ→β\βλ

β→δ\δn

δ→ξ\ξθ\(λ)

其中:λ是—个分子式;δ或是一个元素,或是一个带括号的(子)分子式,元素或是一个大写字母(记为ξ),或是一个大写字母和一个小写字母(记为ξθ)β或是一个δ,或是在δ之后接上一个整数n,δn表示β有n个δ的元素或(子)分子式。—个完整的分子式由若干个β组成。

当然一个正确的分子式除符合上述文法规则外,还应满足分子式本身的语义要求。

下面的程序输入分子式,按上述文法分析分子式,并计算出该分子式的分子量。例如:元素H的原子量是1,元素O的原子量是16。输入分子式H2O,程序计算出它的分子量为18 (1×2+16)。程序中各元素的名及它的原子量从文件atom.dat中读入。

[程序5]

include < stdio. h >

include < string. h >

define MAXN 300

define GMLEN 30

struct elem { char name[ ]; /* 元素名*/

double v;/*原子量*/

} nTbl [MAXN];

char cmStr [GMLEN], * pos;

int c;FILE * fp;

double factor( );

double atom( ) /* 处理文法符号δ*/

{char w [3];int i; double num;

while((c = * pos++) =='||c =='\t'); /*略过空白字符*/

if(c == '\n') return 0.0;

if(c>='A' && C <='Z') {/*将元素名存入W */

w[i =0]=c;c= * pos ++

if(c >='a'&& c <='z')w[ ++i] =c;else pos--;

w[ ++i] ='\0',

for(i =0;nTbl [i]. v >0.0;i ++)

if(strcmp (w,nTbl[i]. name) ==0) return nTbl [i]. v;

printf (" \n元素表中没有所输入的无素: \t%s\n',w); retur n - 1.0;

} elseif (c = ='(') {

if((num=(1)) <0.0)return -l.0; /*包括可能为空的情况*/

if( * pos ++ ! = ')') { printf (" 分子式中括号不匹配!/n") ;return - 1.0; }

return num;

}

printf ("分子式中存在非法字符:\t%c\n" ,c);

return - 1.0;

}

double mAtom( ) /* 处理文法符号β*/

{ double num ;int n = ];

if((num=(2)) <0.0)return-l.0;

c= *pos++;

if(c >='O'&&c <='9') {

n = 0; while(c > = 0&&c < ='9')

{n=(3);

c= *poss ++;

}

}

pos --;

return num * n;

}

double factor( ) /*处理文法符号λ*/

{ double num =0.0,d;

if(( hum = mAtom ( )) < 0.0) return - 1.0;

while( * pos >= 'A'&& * pos <= 'Z'||* pos == '(') {

if((d=(4)) <0.0)return-1.0;

(5);

} return num;

void main( )

{ char fname[ ] ="atom. dst"; /*元素名及其原子量文件*/

int i;double num;

if((fp=fopon(fname,"r" )) == NULL) { /*以读方式打开正文文件*/

prinff("Can net open%s file. \n' ,fname) ;return /*程序非正常结束 */

i=0;

while(i < MAXN&&fscanf (fp," %s%lf,bTbl[i]. name,&nTbl[i]. v) ==2)

i++;

fclose(fp) ;nTbl[i]. v =-1.0;

while(1) [/*输入分子式和计算分子量循环,直至输入空行结束*/

printf(" \n 输入分子式! (空行结束) \n" ) ;gets(cmStr);

pos = cmStr;

if(cmStr[0] == '\0') break;

if( (num = later( ) ) > 0.0)

if( * pos! = '\0')printf("分子式不完整! \n" );

else printf("分子式的分子量为%f\n",num);

}

点击查看答案
下载上学吧APP
客服
TOP
重置密码
账号:
旧密码:
新密码:
确认密码:
确认修改
购买搜题卡查看答案
购买前请仔细阅读《购买须知》
请选择支付方式
微信支付
支付宝支付
选择优惠券
优惠券
请选择
点击支付即表示你同意并接受《服务协议》《购买须知》
立即支付
搜题卡使用说明

1. 搜题次数扣减规则:

功能 扣减规则
基础费
(查看答案)
加收费
(AI功能)
文字搜题、查看答案 1/每题 0/每次
语音搜题、查看答案 1/每题 2/每次
单题拍照识别、查看答案 1/每题 2/每次
整页拍照识别、查看答案 1/每题 5/每次

备注:网站、APP、小程序均支持文字搜题、查看答案;语音搜题、单题拍照识别、整页拍照识别仅APP、小程序支持。

2. 使用语音搜索、拍照搜索等AI功能需安装APP(或打开微信小程序)。

3. 搜题卡过期将作废,不支持退款,请在有效期内使用完毕。

请使用微信扫码支付(元)
订单号:
遇到问题请联系在线客服
请不要关闭本页面,支付完成后请点击【支付完成】按钮
遇到问题请联系在线客服
恭喜您,购买搜题卡成功 系统为您生成的账号密码如下:
重要提示: 请勿将账号共享给其他人使用,违者账号将被封禁。
发送账号到微信 保存账号查看答案
怕账号密码记不住?建议关注微信公众号绑定微信,开通微信扫码登录功能
警告:系统检测到您的账号存在安全风险

为了保护您的账号安全,请在“上学吧”公众号进行验证,点击“官网服务”-“账号验证”后输入验证码“”完成验证,验证成功后方可继续查看答案!

- 微信扫码关注上学吧 -
警告:系统检测到您的账号存在安全风险
抱歉,您的账号因涉嫌违反上学吧购买须知被冻结。您可在“上学吧”微信公众号中的“官网服务”-“账号解封申请”申请解封,或联系客服
- 微信扫码关注上学吧 -
请用微信扫码测试
选择优惠券
确认选择
谢谢您的反馈

您认为本题答案有误,我们将认真、仔细核查,如果您知道正确答案,欢迎您来纠错

上学吧找答案