买书问题的动态规划实现
2014-11-25 14:15
246 查看
<pre name="code" class="python">#---*--- encoding=utf-8 ----*----- #---------------------------- #买书问题 #贪心算法是失效的,5,3->5,4单个并不是最优的,这次选择会影响下一次的选择的 #比如反例:(5,5,5,3,3)贪心的策略为(5,5,5,3,3)--133.2, #改进的贪心策略为(5,5,4,4,3)--132.8, #而实际的最优的策略为(5,4,4,4,4)--132.4 #动态规划多采用递归实现,但是递归的性能不是很好,有时间和空间的复杂度的占用 #注意递归的终止条件和循环变量的控制 #---------------------------- import copy def buy_book_question(y1,y2,y3,y4,y5): bookList=[] bookList.append(y1) bookList.append(y2) bookList.append(y3) bookList.append(y4) bookList.append(y5) bookList.sort(reverse=True) y1,y2,y3,y4,y5=bookList[0],bookList[1],bookList[2],bookList[3],bookList[4] # solution=00000 if len(bookList)==5: if y1==y2==y3==y4==y5==0: return 0 else: if y5>=1: x1=5*8*0.75+buy_book_question(y1-1,y2-1,y3-1,y4-1,y5-1) # solution=y1*10000+y2*1000+y3*100+y4*10+y5 else: x1=10**10 if bookList[3]>=1: x2=4*8*0.8+buy_book_question(y1-1,y2-1,y3-1,y4-1,y5) # solution=y1*10000+y2*1000+y3*100+y4*10+y5 else: x2=10**10 if bookList[2]>=1: x3=3*8*0.9+buy_book_question(y1-1,y2-1,y3-1,y4,y5) # solution=y1*10000+y2*1000+y3*100+y4*10+y5 else: x3=10**10 if bookList[1]>=1: x4=2*8*0.95+buy_book_question(y1-1,y2-1,y3,y4,y5) # solution=y1*10000+y2*1000+y3*100+y4*10+y5 else: x4=10**10 if bookList[0]>=1: x5=8+buy_book_question(y1-1,y2,y3,y4,y5) # solution=y1*10000+y2*1000+y3*100+y4*10+y5 else: x5=10**10 minVal=min(x1,x2,x3,x4,x5) # print solution return minVal else: return 0 def pass_reference_param(bookList): bookList[5].append("*") bookList[5][3].append("i love you") print bookList if __name__ == '__main__': bookList=[5,5,5,3,3,[1,2,3,[]]] minVal=buy_book_question(5,5,5,3,3) xx=xx=copy.copy(bookList) print id(xx[5]) print id(bookList[5]) pass_reference_param() print minVal print bookList
相关文章推荐
- 动态规划-最长公共子串问题的实现
- 动态规划之滑雪问题c++实现
- 动态规划之背包问题01——Java实现
- 动态规划之背包问题01--java实现
- 流水线调度最优问题(装配线调度问题)动态规划 O(n)时间(线性时间)C++实现
- 0-1背包问题的动态规划实现
- 动态规划与钢条切割问题 C++实现
- 动态规划之装配线问题(递归实现)
- 数据结构 练习 19-活动选择问题的实现(动态规划 和 贪心)
- 动态规划:钢条切割问题实现
- 流水线调度问题实现(动态规划基础---------问题取自算法导论)
- 动态规划之最长公共子序列问题 C++实现
- 流水线调度最优问题(装配线调度问题)动态规划 O(n)时间(线性时间)C++实现
- 动态规划解决矩阵链乘问题的java编码实现
- C++实现算法导论十五章动态规划之钢条分割问题
- Python实现动态规划切割钢条问题
- 动态规划之0-1背包问题(C实现)
- 动态规划:java实现最大字段和问题
- 动态规划--LIS(nlogn实现,轮船问题或建桥问题)