算法设计二(2)——贪心算法求解背包问题

代码链接:pan.baidu.com/s/1rIugypf7lhUTfwdAG0Gv_w 
码:w38a 

算法分析与设计

时间

2020.4.22

实验名称

贪心算法求解背包问题

实验目的

通过上机实验,要求掌握贪心算法的问题描述、算法设计思想、程序设计。

实验原理

利用贪心法求解背包问题,并计算出程序运行所需要的时间。给定任意几组数据,利用贪心法求解背包问题的思想,选好物品使得背包价值最大。

实验步骤

问题分析

形式化描述:给定c >0, wi >0, vi >0 , 1≤i≤n.要求找一n元向量A=(x1,x2,…,xn), 0<=xi<=1(0~1表示取物品的某一部分),1<=i<=n,使得 ∑ wixi≤c(物品的重量和小于背包总容量)而且∑ vixi达到最大值;

算法思想

将物品按照单位重量价值进行排序(从大到小),将尽可能多的单位重量价值最高的物品装入背包,若将这种物品全部装入背包后,背包还有多余容量,则选择单位重量价值次高的并尽可能多地装入背包。如果最后一件物品无法全部装入,则计算可以装入的比例,然后按比例装入。

算法步骤

①编写数据生成程序,随机生成三种规模输入文件

②将文件中数据读入w、v数组;

③对v[i]/w[i]进行从大到小排序;

④遍历排序好的序列,如果能将i物品全部放入背包则全部放入,直到遇到一个物品i的重量大于剩余容量,则将剩余容量的物品i放入背包,遍历结束;

关键代码

关键代码(带注释)

1. 定义结构体保存第i个物品的标号i和它的单位重量的价值;

定义结构体的目的是在对单位重量的价值进行排序后可以得到排序后的物品的标号;

2. sort函数所需的第三个参数

直接对每个物品的结构体进行排序(不改变w、v数组);

3. 贪心算法求解函数(核心)

x数组保存了含有物品标号与单价的结构体,首先将该结构体进行排序;

接着从排序后的结构体的第一个物品进行遍历,做如下处理,直到背包塞满:

如果物品i可以全部放入则直接加上v[x[i].id](第x[i].id个物品的价值),否则只放入物品的一部分令背包装满即可;

4. 读取文件

 

在进行输入的同时计算出物品单位重量价值;

生成数据文件的方法与测试时间的方法与实验一相同;

测试结果

运行结果截图及分析

例题输入输出文件:

 

运行结果正确;

三种规模的数据输入对比

三种规模分别为:10、100、10000;

这种算法的输入数据与输出结果都可以是浮点数;

三种数据规模所需运行时间因为机器因素没有明显的呈现出nlogn的增长趋势,但是在数据规模增到10000时时间有明显的增加;

时间复杂度分析

排序算法(快速排序)的时间复杂度为O(nlogn),后面进行的贪心选择算法就算把数组全部遍历时间复杂度也只有O(n),因此排序算法是这个问题的关键算法,整个问题的时间复杂度为O(nlogn);

实验心得

通过这次实验,我回顾了贪心算法的基本原理,通过编程解题让我更加熟悉了这个算法的用法和优点。

定义结构体是为了确保在对均值排序后能够通过结构体中的id查到对应单价的w、v,这也可以通过数组来实现;这种对应的关系是一种解题的小技巧,与第一个实验0-1背包问题中的jmax都是有优化程序的作用的;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值