问答题

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






[程序说明]
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]
求解“背包问题”常用的方法有哪几种各有什么样的特点

【参考答案】

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

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

问答题
[说明] 在一些应用场合中,需要对用户的输入数据进行检查监控。以下VisualBasic程序实现了对新添加到 List列表的内容进行监控,拒绝向List列表添加重复信息。例如,在List列表中存在元素“a01001;a01002”,如果用户输入数据为“aOl001”或“a01002”,系统则弹出提示信息,拒绝将新数据加入List列表;如果用户输入的数据不同与List列表中的任何一个元素,则作为新元素加入List中。VisualBasic界面显示如图11-5所示。根据程序功能说明,完成程序代码。 [代码1] Begin VB.Form Form1 Caption=“List列表拒绝添加重复信息” ...窗体描述(略) Begin VB.CommandButton Command2 Caption=“退出” ...窗体描述(略) End Begin VB.CommandButton ommand1 Caption=“添加” ...窗体描述(略) End Begin VB.TextBox Text1 ...窗体描述(略) End Begin VB.ListBox List1 Height=1860 ItemData= Form1.frx : 0000 Left=1020 List= Form1.frx : 0002 TabIndex=0 Top=525 Width=2580 End Begin VB.Label Labell BackStyle=0 ’Transparent Caption= 请输入编号 ...窗体描述(略) End End [代码2] Attribute VB_Name= Form1 Attribute VB_GlobalNameSpace=False Attribute VB_Creatable=False Attribute VB_PredeclaredId=True Attribute VB_Exposed=False Private Sub Form_Load ( ) Listl.AddItem a01001 Listl.AddItem a01002 End Sub Private Sub Command1 Click ( ) Dim Myval As Long For i=0 To (1) (2) If (3) Then MsgBox 系统不允许重复输入,请重新输入 Exit Sub End If (4) (5) End Sub