贪心算法
是一种在每一步选择中都采取在当前状态下最好或最优的选择 从而希望
导致结果是最好或最优的算法
1. 求解每种水果的单价
苹果 1/kg
梨子 3/kg
香蕉 2/kg
菠萝 4/kg
圣女果 1.5/kg
2. 水果的重量 与 背包的总质量
3.首先放水果单价比较高的水果
菠萝 20kg
梨子 30kg
香蕉太重
圣女果 50kg
总价值: 80+90+75
把求解的问题 分成若干个子问题
把对每一个子问题的求解 得到的子问题的局部最优解
把子问题的局部最优解合成原来问题的一个解
贪心算法解决问题的前提:
局部最优策略能够产生全局最优解
动态规划
动态规划 dynamic programming 简称 dp
通过把原问题分解为相对简单的子问题
动态规划的核心就是**记住已经解决过的子问题的解**
1. 自顶向下的备忘录法
2. 自底向上
用传统递归的方式解决斐波那契数列问题 很多值会重复计算
方法一 自顶向下备忘录法
public class Fb{
// 计算斐波那契数列
public static int fib(int n , int [] memory){
//用-1 表示备忘录中没有记录fn的值
// 如果备忘录中记录了该值 直接返回
if( memory[n] != -1 ){
return memory[n]
}
if( n <= 2 ){
memory[n] = 1;
}else{
memory[n] = fib(n-1,memory) + fib(n-2,memory)
}
return memory[n];
}
public static int fibonaci(int m){
if(n <= 0){
return -1
}
int [] memory = new int[n+1]
for(int i = 0 ; i <= n ; i++){
memory[i] = -1;
}
return fib(n,memory);
}
}
方法2 自底向上的动态规划
memory[1] = 1;
memory[2] = 1;
for(int i = 3; i <= n ; i++ ){
memory[i] = memory[i-1] + memory[i-2]
}
return memory[n];