厥轧匠 发表于 7 天前

常用背包dp模板(未完待续)

这里是作者的留言板

部分板子优化中...;
你好哇,我是flypig114;
先说一句:本人仅在博客园发表博客,其他皆为盗版;
可能某些人能看出上面那句是什么意思,我也不多说了;
代码里有变量(只不过最近会改变量名使其更正规)数组的注释,so...不多废话,直接上正题!;
01背包

<blockquote>这里是题目AWA:
有\(N\)件物品和一个容量是\(M\)的背包。每件物品只能使用一次。第 \(i\)件物品的体积是\(w\),价值是\(v\)。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。
输入格式
第一行两个整数,\(N\),\(M\),用空格隔开,分别表示物品数量和背包容积。接下来有 \(M\)行,每行两个整数\(wi\),\(vi\),用空格隔开,分别表示第\(i\)件物品的体积和价值。

输出格式
输出一个整数,表示最大价值。
数据范围
\(0 n >> m;    for (i = 1; i > w >> v;    }    //进行处理    for (i = 1; i = 0; j--)//从背包容量开始,保证每个物品都考虑过      {            if(j>=w)//判断是否可以放入            {                dp = max(dp] + v, dp);//判断是否放入,dp]+v更大则放入            }            else            {                dp = dp;//不放入            }                      }    //结束首战告捷    cout > n >> m;    for (i = 1; i > w >> v;    }    //重中之重(好像就这里改了)    for (i = 1; i = 0; j--)      {            if(j>=w)            {                dp = max(dp] + v, dp);            }      }    }       //可以输出了    coutv >> w;}//完全背包启动!for (i = 1; i > n;    for (i = 1; i > w >> v >> s;    }        //熟悉的流程    for (i = 1; i = v; j--) //倒序是为了防止重复计算      {            for (k = 1; k * vn;    for (i = 1; i > v >> w >> s;    }    //拆分方式更加优美    for (i = 1; i = s * v; j--)      {            dp = max(dp, dp * v] + s * w);            }        }        //我的回合!输出!    cout > n >> m;    for (i = 1; i > v >> w >> s;    }        for(i=1;i
页: [1]
查看完整版本: 常用背包dp模板(未完待续)