动态规划之背包问题

来源:互联网 发布:紫色水离子淘宝店 编辑:程序博客网 时间:2024/06/11 23:50

          修改于2016年5月8日  13:14     

   这么长时间了,终于对背包差不多了解了,这个是01背包问题,里面的最主要的还是找出状态转移方程。动态规划是运筹学的一个分支,是求解决策过程最优化的数学方案。最优化原理,把多个阶段过程转化为一系列单阶段的问题,逐个求解。它里面包含两个重要的性质——最优子结构和重叠子问题

                        

#include <stdio.h>// 容量是10个void backpack_01(int *w,int *v,int (*max)[11]){    int  i = 0;    int  j = 0;    for(i = 0; i <= 10; i++){        if(i >= w[0]){           max[0][i] = v[0];        }    }    for(i = 1; i < 5; i++){        for(j = 0; j <= 10; j++){            if(j > w[i] && ((max[i-1][j-w[i]] + v[i]) > max[i-1][j])){                max[i][j] = max[i-1][j-w[i]] + v[i];            }else{                max[i][j] = max[i-1][j];            }         }//end for 2    }//end for 1}void print_backpack_01(int (*max)[11]){   int i = 0;   int j = 0;   for(i = 0; i < 5; i++){      for(j = 0; j <= 10; j++){        printf("%5d ",max[i][j]);      }//end for 2      printf("\n");   }//end for 1}int main(int argc,char *argv[]){    int w[5] = {2,2,6,5,4};    int v[5] = {6,3,5,4,6};    int max[5][11] = {0};    backpack_01(w,v,max);    print_backpack_01(max);    return 0;}


 

 演示结果

 

           

 

 

 

 

 

 

              

0 0
原创粉丝点击