完全背包 (DP)
2024-10-11 04:08:28
输入:
n=3
(w,v)={(3,4),(4,5),(2,3)}
W=7
输出:
10(0号物品选1个,2号物品选2个)
和01背包的区别是物品可以任意选择.
令dp[i+1][j]=从前i种物品中挑选任意总重量不超过j时总价值的最大值.那么递推关系为:
dp[0][j]=0
dp[i+1][j]=max{dp[i-k*w[i]]+k*v[i]|0<=k}
=max{dp[i][j-k*w[i]]+k*v[i]|0<=k}
int dp[MAX][MAX]; //DP数组 void solve()
{
for(int i=; i<n; i++){
for(int j=; j<=W; j++){
for(int k=; k*w[i]<=j; k++){
dp[i+][j]=max(dp[i+][j],dp[i][j-k*w[i]]+k*v[i]);
}
}
}
printf("%d\n",dp[n][m]);
}
复杂度为:O(nW2)
修改后:
void solve()
{
for(int i=; i<n; i++){
for(int j=; j<=W; j++){
if(j<w[i]){
dp[i+][j]=dp[i][j];
}
else{
dp[i+][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]);
}
}
}
printf("%d\n",dp[n][W]);
}
复杂度:O(nW)
当然,01背包和完全背包可以通过不断重复利用一个数组来实现.
01背包问题的情况:
int dp[MAX]; //DP数组 void solve()
{
for(int i=; i<n; i++){
for(int j=W; j>=w[i]; j--){
dp[i]=max(dp[j],dp[j-w[i]+v[i]]);
}
}
printf("%d\n",dp[W]);
}
完全背包问题的情况:
int dp[MAX]; //DP数组 void solve()
{
for(int i=; i<n; i++){
for(int j=w[i]; j<=W; j++){
dp[i]=max(dp[j],dp[j-w[i]+v[i]]);
}
}
printf("%d\n",dp[W]);
}
两者的差异就变成只有循环方向.重复利用数组虽然可以节省内存空间,但是得不好将有可能留下bug,所以要格外小心.不过出于节约内存的考虑,有时候必须要重读利用数组.也存在通过重复利用能够进一步降低复杂度的问题.
DP数组的再利用:
可以通过讲两个数组滚动使用来实现重复利用.
dp[i+1][j]=max(dp[i][j],dp[i+1][j-w[i]]+v[i])
dp[i+1]计算时只需要dp[i]和dp[i+1],所以可以结合奇偶性写成如下形式:
int dp[][MAX]; //DP数组 void solve()
{
for(int i=; i<n; i++){
for(int j=; j<=W; j++){
if(j<w[i]){
dp[(i+)&][j]=dp[i&][j];
}
else{
dp[(i+)&][j]=max(dp[i&][j],dp[(i+)&][j-w[i]]+v[i]);
}
}
}
printf("%d\n",dp[n&[W]);
}
<<挑战程序设计竞赛>>读后感
最新文章
- java-w3c.document生成xml文件
- 将windows server 2016改造为像windows 10一样适合个人使用的系统
- linux command screen
- extjs grid renderer用法
- Core Java Volume I — 4.4. Static Fields and Methods
- 解决SQLite数据库中文乱码问题
- Oracle RAC 11gR2 修改本地及SCAN监听端口
- DataGridView单元格合并
- FilterDispatcher已被标注为过时解决办法
- docker private registry使用
- 关于jquery的$each((Object, function(p1, p2)用法
- 代码规范--捡拾(SQL语句)
- JS滚动显示
- 关于linux下部署JavaWeb项目,nginx负责静态资源访问,tomcat负责处理动态请求的nginx配置
- React基础知识备忘
- skyline添加wfs服务时,弹出错误“no layers were found”!
- IDEA 在使用的过程中字符间距变大的问题
- iOS - DNS劫持
- 批量增删改";_bulk";
- 3D-爱心
热门文章
- SqlServer表EXCEL数据复制的另一种方法
- 【原创】纯OO:从设计到编码写一个FlappyBird (三)
- linux、hdfs、hive、hbase经常使用的命令
- 【转】HLSL基础
- GLEW_ERROR_NO_GL_VERSION的解决方法
- 关于WCF的引用,添加服务和添加web服务的区别
- POJ 2217 Secretary (后缀数组)
- Android应用开发:LoaderManager在Activity/Fragment中的使用分析
- wpf 9张图片的连连看
- PKU A Simple Problem with Integers (段树更新间隔总和)