# 第十二课 调试的更多内容，背包问题，动态规划简介

## 2017-02-09

* 关于调试剩下的几个小点
  * 错误可能不是发生在你认为会发生的地方，如果是，你可能已经找到它了
  * 注意几件事
    * 自变量顺序 Reversed order of arguments &#x20;
    * 拼写错误 Spelling
    * 初始化 Initialization , 循环开始的初始化
    * 对象与值比较 Object vs Value equality ==
    * Aliasing 别名混淆&#x20;
      * Deep vs shallow copy 深复制和浅复制
    * Side effect 副作用 函数可能会修改实参值
* 熟练的程序员会建立一个自己的犯错模型
  * 知道自己会犯什么错误
  * 多反省自己
  * 收集自己犯过是错误
  * 遇到错误首先想到这些错误
* Keep record of what you tried 记录你尝试过的修改&#x20;
  * 系统化编程 不在已经犯过的错误上浪费时间
* Reconsider assumption 重新考虑你的假设&#x20;
  * 例如运行的不是你在写的程序
* Debug code, not comments 调试的是代码不是注释
* Get help - Explain 寻求帮助，要会解释
* Walk away 休息一会
* 修改错误的注意点
  * Haste makes waste 欲速则不达
    * 方案是否能解决问题并不引起其他问题
  * Code should not always gain 代码不能总是增长
    * 清理代码，整理代码
  * Make sure that you can revert 保证可以回滚代码
    * Save old versions
* 公式化问题的处理方法
* Optimization problems 优化问题 优化问题一般有两个要点
  * A function to maximize(min) 要求出最大或最小值
  * A set of constrains 有一系列约束
  * 典型问题&#x20;
    * 最短路径问题 shortest path
    * 旅行商问题 Traveling sales problem (TSP)
    * 装箱问题 Bin packing 装东西顺序之类的
    * Sequence alignment problem 序列对比问题 DNA,RNA,自然语言
    * Knapsack 背包问题
      * 判断要带多少东西，最大化价值
* Problem reduction 问题规约 举这么多例子是为了让大家进一步考虑问题规约
* 处理一个问题，将它归结映射到一个老问题（已经解决的问题），利用前人的成果
* 下面看背包问题
* 现在大部分优化问题都没有快速的解决方案
* 目前只处理过亚线性问题，最多也就是多项式问题，这些不能处理背包问题
* Continuous knapsack problem 连续背包问题
* 问题描述
  * 你有一个 8lbs 的包
  * 4lbs Au dust 金沙
  * 3lbs Ag dust 银沙
  * 10lbs raisins 葡萄干
* 如何系统化这个问题？
  * 求 Cg\*PG + Cs\*PS + Cr\*PR 的最大值
  * 约束条件是PG+PS+PR < = 8
* 解决方法很简单，4磅金沙，3磅银沙，1磅葡萄干
* Greedy algorithm 贪婪算法 上面描述的其实是一种贪婪算法
  * 每一个步骤都在最大化你的价值，局部最优
* 贪婪算法并不总是适用
* Locally optinal decisions do not always lead to global optimum 局部最优不一定能得到全局最优
* 变种 0/1 Knapsack problem 0/1 背包问题
  * n items 每个要么都拿要么不拿
  * 四个东西 手表，收音机，花瓶，画
* 贪婪的贼 贪婪算法 先拿最有价值的
* 动作慢的贼怎么做？ 穷举
  * 想要最大值的函数是 ∑PiXi X是0/1向量
  * 约束函数是 ∑WiXi < = C 背包容量
  * 穷举法是指数级的 Exponential
* Dynamic programming 动态编程 数学家Bellman发明的词，因为军方为了不让别人知道研究的是什么。。。
  * Overlapping subproblems 重叠子问题 又被叫作Optimal substructure 最理想子结构
* 先看一个重叠子问题的例子，用递归解决Fibonacci数问题
  * 递归的方法，增长率很高
  * 里面重叠子问题也很多，求fib(5) 会调用 fib(4) fib(3)，而求fib(4)又会调用fib(3) fib(2)，这里fib(3)调用了2次，其他的也是
  * 下次课会看另一种解决方法，增长率会低很多
