基础三背包:
学习三背包问题已有几天了,特来总结下三背包问题,加深自己的印象。
01背包
01背包就是有N件物品,你可以选择拿或不拿,在背包最大容量下,获得最大价值。
附上函数代码:
void dp1()
{
for(int i=0; i<n; ++i)
{
for(int j=m; j>=w[i]; j--)
{
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
cout<<dp[m]<<endl;
}
完全背包
完全背包就是有N种物品,每种物品的是无限的,你可以选择拿或不拿,在背包最大容量下,获得最大价值。
附上函数代码:
void dp2()
{
for(int i=0; i<n; ++i)
{
for(int j=w[i]; j<=m; ++j)
{
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
cout<<dp[m]<<endl;
}
多重背包
多重背包就是也有N种物品,每种物品的是有限的,你可以选择拿或不拿,在背包最大容量下,获得最大价值。
附上函数代码:
void dp3()
{
for(int i=0; i<n; ++i)
{
for(int j=1; j<=bag[i]; ++j)
{
for(int k=m; k>=w[i]; k--)
{
dp[k]=max(dp[k],dp[j-w[i]]+v[i]);
}
}
}
cout<<dp[m]<<endl;
}
并附上一个新学的小东西 INF 无穷量。
const int inf=0x3f3f3f;
表示inf为无穷大!!!