lijiagui

 **利用贪心算法求解的问题具有两个特性:

    1.贪心选择策略:指原问题的最优解可以通过一系列局部最优得到

    2.最优子结构性质:一个问题的最优解是否包含其子问题的最优解。 

问题:选择装载最多的物品

  容器体积为:20

  物品体积【L[i]】:4,1,3,2,7,12,11,7  

 

  1.算法设计:

    (1),当容器体积为定值C时,L[i]越小,可能装载的物品数量 n 就越大,只要依次选择最小的物品,直到不能装为止。

    (2), 把 n 个物品的重量从小到大(非递减)排序,然后根据贪心选择策略尽可能多的选出前 i 个物品,直到不能继续装为止,此时达到最优。

  python代码展示:(欢迎大佬指点)

  

 1 class greedy:
 2     l1=[]
 3     ans=0   #代表已经装载物品的个数
 4     tmp=0   #代表物品的体积
 5     c=0    #载重量
 6     def __init__(self,lists,c):
 7         self.c=c
 8         self.l1=lists
 9 
10 
11     def load(self):
12         self.l1.sort()
13         #按照贪心策略寻找最优解
14         for i in self.l1:
15             self.tmp += i
16             if(self.tmp<=self.c):
17                 self.ans+=1
18             else:
19                 break
20 
21         return self.ans
22 
23 #Test:
24 g1=greedy([4,1,3,2,7,12,11,7],20)
25 print(g1.load())

 

  算法复杂度分析:

  1.时间复杂度: 首先按照物品体积进行排序,调用sort() 函数,其最优时间复杂度为O(n),最差时间复杂度为 O(n logn),平均时间复杂度为O(n logn), 其中按照 贪心策略寻找最优解的 for 语句的时间复杂度为均为 O(n),因此时间复杂度为 O(n+nlogn)。

  2.空间复杂度: 程序中变量tmp,ans等占用了一些辅助空间,这些辅助空间都是常数阶的,因此空间复杂度为 O(1)。

 

*也可以把按照代码中“贪心策略找最优解”替换成 load1():如下:

    

 1 class greedy:
 2     l1=[]
 3     ans=0   #代表已经装载物品的个数
 4     tmp=0   #代表物品的体积
 5     c=0    #容器体积
 6     def __init__(self,lists,c):
 7         self.c=c
 8         self.l1=lists
 9 
10    def load1(self):
11         self.l1.sort()
12         #按照贪心策略寻找最优解
13         for i in self.l1:
14             print(i)
15             self.tmp+=i
16             if(self.tmp>=self.c):
17                 if self.tmp==self.c:
18                     self.ans=self.l1.index(i)+1
19                 else:
20                     self.ans=self.l1.index(i)
21 
22                 return self.ans
23                 break
24 
25 
26 g1=greedy([4,1,3,2,7,12,11,7],20)
27 print(g1.load1())

 

 

分类:

技术点:

相关文章: