问答题

[说明]
背包问题就是有不同价值、不同重量的物品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因为是最佳方案

[问题2]
求解“背包问题”常用的方法有哪几种各有什么样的特点

【参考答案】

“背包问题”求解方法主要是一些启发式算法,如贪婪算法、递归算法等。应用递归算法的目的是穷举所有可能的解,从中选出最佳解。......

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

问答题
阅读下列程序说明和C程序,将应填入 (n) 处的字句写在答卷纸的对应栏内。 【程序说明】 该程序定义了两个子函数strsort和strmerge。它们分别实现了将一个字符串按字母顺序排序和将两个字符串合并排序,并删去相同字符。在主函数里,先输入两个字符串s1和s2,然后调用strsort函数对它们分别排序,然后调用strmerge函数将s1和s2合并,将合并后的字符串赋给字符串s3,最后输出字符串s3。 【程序】 #include <stdio.h> void strmerge(char *a,char *b,char *c) 将字符串a,b合并到字符串c char t,*w; W=c; while( (1) ) 找到字符串a,b当前字符中较小的字符 if(*a<*b) t=-*a, (2) else if(*a>*b) t=*b; (3) else 字符串a,b 当前字符相等 t=-*a; a-H-; b-H-; if( (4) ) 开始,可直接赋值 *w=t; else if(t!=*w) 如果a,b中较小的当前字符与c中当前字符不相等,才赋值 (5) if(*a!=’ O’) 如果字符串a还没有结束,则将a的剩余部分赋给c while(*a!=’ 0’) if(*a!=*w) *(++w)=*a; a++; else (6) if(*b!= ,’ 0’) 如果字符串b 还没有结束,则将 b 的剩余部分赋给 c while(*b !=’ 0’) if(*b!=*w) *(++w)=*b; b++; else b++; (7) void strsort(char *s) 将字符串 s 中的字符排序 int i,j,n; char t,*w; w=s; for(n=O;*w!=’ O’;n++) 得到字符串长度 n w++; for(i=O;i<n-1;i++) 对字符串 s 进行排序,按字母先后顺序 forO=i+ 1 ;j<n;j++) if( (8) t=s[i]; s[i]=s[j]; (9) void mainO char s1 [100],s2[100],s3[100]; prinff( nlPlease input the first string: ); scanfC( % s ,s1 ); prinff( nPlease input the second string: ); scanf( %s ,s2); strsort(s1); 将字符串s1 排序 strson(s2); 将字符串 s2 排序 prinff( %s n’,s1); printfC % sW’,s2); s3[0]=’ O’; 字符串 s3 的第一个字符先置’ 0’结束标志 (10) ; 将s1和s2合并,按照字母顺序排列, prinff( %s ,s3);