动态规划即为将大问题分为小问题解决,并最终利用小问题的解运作出最终问题的解。

其精髓在于绘制一个二维的表格,这里介绍动态规划最简单的例题——背包问题。

题目:有一个4磅限重的背包,要求尽可能装价值更高的商品。
商品信息:音响 3000元 4磅
笔记本电脑 2000元 3磅
吉他 1500元 1磅
iphone 2000元 1磅

解法(含注释):

int main()
{
    int n=4, v=4;/** n代表商品数量 v代表背包限重 */
    int weight[5]={0, 4, 3, 1, 1}, value[5]={0, 3000, 2000, 1500, 2000};/** weight表示商品重量,value表示商品价值,注意索引0项初值0*/
    for(int i = 1; i <= n; i++)
    {
        for(int j = 0; j <= v;j++)/**开始建表,填完每个重量阈值后更换商品*/
        {
            if(j >= weight[i])/**如果背包可放该商品,则做如下比较*/
            f[i][j] = max(f[i-1][j-weight[i]] + value[i] ,f[i-1][j]);/**将当前商品价值+剩余空间价值与同限重上一行背包的价值比较并更新*/
            //else
            //f[i][j] = f[i-1][j];
        }
    }
    cout << f[n][v] << endl;/**输出*/
}

图片形式:

实际题目会比该例题难度大很多,注意优化和题目陷阱

分类: 计算机

Reason

在漫漫梦路上踽踽独行的人……

0 条评论

发表回复

Avatar placeholder