动态规划算法

迈不过友情╰ 2022-08-09 02:14 395阅读 0赞
  1. 动态规划方法是对解最优问题的一种方法,一种途径,并不是一种特殊的算法。
  2. 执行步骤:
  3. 1. 找出最优解的性质,刻画结构特征
  4. 2. 递归定义最优解
  5. 3. 自底向上方式计算出最优解
  6. 4. 根据计算最优值时得到的信息,构造一个最优解
  7. 总结为2点,建立最优子结构,保证每一个子结构都是最优解;然后重叠子问题,而不是重复子问题,最优解都是建立在最优子结构的基础之上的。
  8. 下面对动态规划的经典问题进行分析:

【0-1背包问题】

  1. 问题描述:有N件物品和一个容量为V的背包。第i件物品的重量是w\[i-1\],价值是v\[i-1\]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。
  2. 理解:0-1是指每个物体都有唯一编号,要么放入背包,要么不放。(区别于物品无限背包问题)
  3. 现在指n=5W=17,物品的价值和重量:
  4. ![SouthEast][]
  5. **(1)递归定义最优解的值:**
  6. ![20151005215519594][]
  7. 理解:(1)物品的下标是从1开始的,当下标为0时,获得的价值为0;包内放入的物品重量为0,则获得价值也为0.
  8. 2)第i个物品不能放入包内时,最优解为前一不放该物品最优解c\[i-1\]\[w\];
  9. 3)第i个物品能放入时,有两种情况:第i个物品的价值valuesi-1)+剩余空间最优解c\[i-1\]\[w-Weights\[i-1\]\];不放入第i个物品之前的最优解c\[i-1\]\[w\]
  10. **(2)算法实现图解**
  11. 1> 判断编号为i的物品能否放入到允许重量w中。例如:c\[3\]\[7\]这个位置,物品3的重量为7,能放入到w=7的包内。

20151005223605757

  1. 2> 比较将3放入包内(10)+剩余控件最优解(c\[2\]\[7-7\]=0)与不放入3的最优解(c\[2\]\[7\]=9)的大小,前者得到的价值大,为最终最优解 ,因此c\[3\]\[7\]=10

20151005224325820

  1. 3c语言代码最优解实现
  2. int ** KnapsackDP(int n,int W,int* Weights,float* Values){ //n:物品个数;W:允许最大数量;Weights:每个物品重量数组;Values:每个物品价值数组
  3. int i,w; //i:指定第几个物品;w:允许重量
  4. int** c=(int**)malloc(sizeof(int*)*(n+1)); //分配空间
  5. for(n=0;i<=n;i++) //每一个物品分配W+1种空间存放0--W种不同情况下最优解
  6. c[j]=(int*)malloc(sizeof(int)*(W+1));
  7. for(w=0;w<W;w++) //第一行赋值为0(没有物品的情况)
  8. c[0][w]=0;
  9. for(i=1;i<=n;i++) //n个物品的循环
  10. c[i][0]=0; //第一列赋值为0(包内允许的重量为0)
  11. for(w=1;w<=W;w++) //w记录每一种重量的下标
  12. if(Weights[i-1]<=w){ //i物品能否放入容量为w的包内
  13. if(Values[i-1]+c[i-1][w-Weights[i-1]]>c[i-1][w]) //比较将i放入包内+剩余控件最优解与不放入i的最优解的大小
  14. {
  15. c[i][w]=Values[i-1]+c[i-1][w-Weights[i-1]]; //将i放入包内+剩余控件最优解为最优解
  16. }else{
  17. c[i][w]=c[i-1][w]; //不放入i的最优解为最优解
  18. }
  19. }else{
  20. c[i][w]=c[i-1][w]; //不放入i的最优解为最优解
  21. }
  22. }
  23. return c;
  24. }
  25. 该代码实现上表的横向插入,插完第i行然后插入第i+1行。

【总结】

  1. 在问题相对复杂的情况下,代码不能马上理解,这时候我们可以先根据自己的理解对问题的图进行理解,根据自己的理解试试能否理解代码,如果出现差错,可以将例题数据带入代码进行运算,可以理解代码的相对流程,然后再思考代码的整体框架实现。

发表评论

表情:
评论列表 (有 0 条评论,395人围观)

还没有评论,来说两句吧...

相关阅读

    相关 动态规划算法

    一:动态规划算法 1:动态规划算法介绍 1) 动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获

    相关 动态规划算法

           动态规划方法是对解最优问题的一种方法,一种途径,并不是一种特殊的算法。        执行步骤:                1. 找出最优解的性质,刻画结