dp小结|背包问题

1.先放上0-1背包模板

二维数组

for(int i=1;i<=n;i++)//枚举 物品 
    for(int j=1;j<=V;j++)//枚举体积 
    //这个位置是可以正序枚举的.  qwq
    //一维01背包必须倒叙  emmm
    //这个没错a emmm  
        if(j>=c[i])
            f[i][j]=max(f[i-1][j],f[i-1][j-c[i]]+w[i]);//状态转移方程.
        else f[i][j]=f[i-1][j].

滚动二维数组

    int dp[2][10010];
    int row = 0; //滚动 
    for (int i = 1; i < n; ++i) {
        row = 1 - row;
        for (int j = 1; j <= i * (i + 1) / 2; ++j) {//这里可以减少枚举
        if(j>=c[i])
            f[row][j]=max(f[1-row][j],f[1-row][j-c[i]]+w[i]);//状态转移方程.
        else f[row][j]=f[1-row][j].
        }
    }

一维数组(逆序)

for(int i=1;i<=n;i++)//枚举 物品 
    for(int j=V;j>=c[i];j--)//枚举体积 
        f[j]=max(f[j],f[j-c[i]]+w[i]);//状态转移方程. 

模板题:洛谷:P1048采药
“采药”这道题套模板就行了,从二维到一维优化。

2.顺便再复习记忆化搜索洛谷:P1048采药记忆化搜索做法题解

先想到dfs搜索暴力解题,就是多参数递归,出口记录搜索到的值
再想到记忆化搜索,什么时记忆化搜索?记录每一次dfs答案,免去重复计算,从而起到优化时间复杂度的作用
记忆化搜索记录什么值呢?记录每次搜索结束找到的价值(不一定最大)

如何想到可以用记忆化搜索?

3.蓝桥杯考过的记忆化搜索——2013年C++B组第9题地宫取宝

使用四维数组缓存记录。

4.蓝桥杯考过的0-1背包:2014年C++A组第十题-波动数列

这道题比较难想到0-1背包,

猜你喜欢

转载自www.cnblogs.com/fisherss/p/10561139.html