贪心算法实验(求解背包问题)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法分析与设计实验报告

第四次实验

//实现单位重量的平均价值 测试结果

sort(item,item+n,comparis on); 的物品的排序

{

if (item[i].w>c) break; tem[i]=1; c-=item[i].w; }

if (i

tem[i]=c/item[i].w;

for (i=0;i

for (int j=0;j

if (item[i].w==tmp[j])

x[j]=tem[i];

} }

待装物品的价值为:

选J 華装下的物品的比例如下:

111 = 1 [21 = 1

[33=0.664667

The time is 0-019请按任意键继绞・・•

for

(i=0;i

{x[i]=0,tem[i]=0;};

float c=m; for

(i=0;i

//物品整件被装下,则x[i]=1; 输入较小的结果:

F 算法二费法rQ-one2\D e bug\ce ro-o n&2 ■召Jew

待装物品

10 28 30

实验心得

助教签名

背包问题背包不同,物品可以部分的放入背包中,所

以思路也不一样,首先就是将物品按照单位质量价值排序,只这

一点就有一点难度。难度在于要是排序后物品的编号就会发生改变,输出的就

不是之前的编号的物品,导致错误,后来发现如果为每一个物品保存一个副本,然后将它们

的编号进行对比,就可以进行正确的输出了。其中这个实验让我学

到了两点:一是结构体的使用,之前一直没有怎么用过,现在才发现自己其实

不会用;二十对于库函数sort函数的使用。感觉每一次实验都有学到东西,很开心。

实验得分

附录:

完整代码(贪心法)

//贪心算法

#include #include #inelude #include using namespacestd;

const int N=10000;

floa v;

floa t w;

floa t

perval ;

};

void Knapsack( int n, float m,st item[], float x[]); // 声明贪心算法求解问题函数

int main()

{

float m;

int n,i;

cout<<"请输入背包的容量: ";

cin>>m;

cout<<"请输入物品的个数: ";

cin>>n;

st item[N];

float x[N+1];

cout<<"待装物品的重量为: "<

for (i=0;i>item[i].w;

cout<

cout<<"待装物品的价值为: "<

for (i=0;i>item[i].v;

cout<

// 计算每一个物品的单位重量的价值

for (i=0;i

clock_t start,end,over; // 计算程序运行时间的算法 start=clock();

end=clock();

over=end-start; start=clock();

Knapsack(n,m,item,x); // 调用贪心算法函数

coutvv"选?择?装a ?下?的i??品?。的i?d…•例Oy如…?下?: e o<

for (i=0;i

//初始化数组x[]及tem[]

// 物品整件被装下,则 x[i]=1;

// 物品只有部分被装下

// 将排好序的物品编号与原始编号匹配

cout<<"["<

printf( "The time is %6.3f",( double )(end-start-over)/CLK_TCK); // 显 示运行时间

system( "pause");

return 0;

}

bool comparison(st a,st b){ // 自定义函数说明 sort 函数使用的形式是从大到 小排序

return a.perval>b.perval;

}

void Knapsack( int n, float m,st item[], float x[])

{

int i;

float tem[N]; // 该变量数组用来记录排好序之后的物品是否被放入背包 float tmp[N]; // 定义一个数组用来保存以前的编号及重量,用于构造最 优解 for (i=0;i

sort(item,item+n,comparison); // 实现单位重量的平均价值的物品的排 序 for (i=0;i

{

if (item[i].w>c)

break; tem[i]=1; c-=item[i].w;

}

if (i

tem[i]=c/item[i]

.w;

for (i=0;i

{

for (int j=0;j

if (item[i].w==tmp[j])

x[j]=tem[i];

相关文档
最新文档