金矿模型之DP学习

来源:互联网 发布:苹果装机必备软件 编辑:程序博客网 时间:2024/06/09 17:02

http://www.cnblogs.com/sdjl/articles/1274312.html


分析:采用作者介绍方法,很容易写出状态转移方程。

假设-有N个金矿,总共people个人、对于金矿i来说需要need[i]个人可以得到gold[i]个金子

状态转移方程:f(people, mine)表示people个人mine个金矿能得到的最大金子数

                            

     

有状态方程写出递归代码:

int f(int people, int mine) {    if(mine == 0) {        if(people >= need[0])            return gold[0];        else            return 0;     } else {        int noMine = f(people, mine - 1);        int hasMine = f(people-need[mine], mine - 1) + gold[mine];        return max(noMine, hasMine);    }}

上述代码没有记录表,因此是个纯递归的过程,不算dp。

添加记录表maxGold[people][mine]表示people个人在mine个金矿中能得到的最大金子数

int maxGold[N_people][N_mine];//初始化为INT_MINint f(int people, int mine) {    if(maxGold[people][mine] != INT_MIN) return maxGold[people][mine];    if(mine == 0) {        if(people >= need[0]) {            maxGold[people][mine] = gold[0];                        return gold[0];        }        else {            maxGold[people][mine] = 0;            return 0;        }     } else {        int noMine = f(people, mine - 1);        int hasMine = f(people-need[mine], mine - 1) + gold[mine];        int max = max(noMine, hasMine);                maxGold[people][mine] = max;        return max;    }}

代码不好看,改善如下:

int maxGold[N_people][N_mine];//初始化为INT_MINint f(int people, int mine) {    if(maxGold[people][mine] != INT_MIN) return maxGold[people][mine];    int max = INT_MIN;    if(mine == 0) {        if(people >= need[0]) {            max = gold[0];                    }        else {            max = 0;        }     } else {        int noMine = f(people, mine - 1);        int hasMine = f(people-need[mine], mine - 1) + gold[mine];        max = max(noMine, hasMine);    }    return max;}
写完发现跟作者写的差不多呀大笑

如何记录金矿选择情况咧? 动态规划对于最优路径的记录貌似不给力呀



-----待解决-----





0 0
原创粉丝点击