您的位置:首页 > 其它

背包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