背包DP(01背包,多重背包,完全背包)
2018-03-29 18:14
337 查看
1.01背包:
//从前一个转态转移过来,选还是不选 for (int i=1; i<=N; i++){ for (int j=0; j<=M; j++){ if (weight[i]<=j){ f[i][j]=max(f[i-1][j],f[i-1][j-weight[i]]+value[i]); } else f[i][j]=f[i-1][j]; } }01背包优化://滚动数组
for (int i=1; i<=N; i++)
for (int j=M; j>=1; j--)
if (weight[i]<=j)
f[j]=max(f[j],f[j-weight[i]]+value[i]);
//优化成二维
int now=1,pre=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=v;j++)
{
if(j>=weight[i])
dp[now][j]=max(dp[pre][j],dp[pre][j-weight[i]]+val[i]);
else
dp[now][j]=dp[pre][j];
}
swap(now,pre);
}2.多重背包//每件物品可以使用num[i]次,求最大值
//第一种
for(i = 0 ; i < m ; i++) //代表物品种类
for(k = 0 ; k < num[i] ; k++) //代表一次放一件,共放了k次
for(j = n ; j >= pri[i]; j--) //放入容量为j的背包
f[j] = max(f[j],f[j-pri[i]]+w[i]);
//第二种
for(i = 0 ; i < m ; i++) ////代表物品种类
for(j = n ; j >= pri[i]; j--) //放入容量为j的背包
for(k = 0 ; k <= min(j/pri[i],num[i]) ; k++) //代表一次放了k件
f[j] = max(f[j],f[j-k*pri[i]]+k*w[i]);3.完全背包//每件物品可以使用无数次,求最大值
memset(dp,-INF,sizeof(dp));
dp[0]=0;
for(int i=0;i<m;i++)
for(int j=c[i];j<=v;j++)
dp[j]=max(dp[j],dp[j-c[i]]+w[i]);
相关文章推荐
- DP背包问题小结(01背包,完全背包,需恰好装满或不需,一维DP、二维DP)
- [DP][01背包]01\完全\多重背包模板
- dp之01背包(从二维到一维)+完全背包
- 夕拾算法进阶篇:17)01背包和完全背包问题 (动态规划DP)
- DP背包之01背包、完全背包、多重背包笔记
- 01背包、完全背包(DP)
- 【HDU 1114】Piggy-Bank(DP-完全背包)
- BZOJ.4753.[JSOI2016]最佳团体(01分数规划 树形背包DP)
- hdu 5410 CRB and His Birthday(01+多重背包 dp)
- 动态规划之01背包,完全背包,多重背包
- hdoj 1561 The more, The Better 【树形dp + 01-背包】【入门】
- 【DP】POJ 1252 完全背包
- 01背包模板和完全背包模板
- 背包之01背包、完全背包、多重背包详解(转)
- DP--完全背包--HDU - 4508
- 01背包及完全背包问题(51Nod - 1085,HDU 1114 Piggy-Bank)
- 算法竞赛入门经典:第九章 动态规划初步 9.2完全01背包
- HDU-CRB and His Birthday(动态规划本质未认清)---01背包与完全背包的结合!
- A 浪哥的烦恼 完全背包dp
- poj 1384 完全背包问题 dp