这几天在写dp入门,就随便写点记录下吧。。。
01背包,物品只能使用一次。
for(int i=1;i<=n;i++)
{
scanf("%d%d",&w,&v);
for(int j=m;j>=w;j--)//从最大开始枚举,保证每样物品只用了一次
{
dp[j]=max(dp[j],dp[j-w]+v);
}
}
多重背包,二进制拆分后,按01背包处理
for (int k = 1; k <= v[i]; k <<= 1)
{
c = k * s[i];
v[i] -= k;
for (int j = m; j >= c; j--)
{
dp[j] = max(dp[j], dp[j - c] + c);
}
}
if (v[i] > 0)
{
c = v[i] * s[i];
for (int j = m; j >= c; j--)
{
dp[j] = max(dp[j], dp[j - c] + c);
}
}
完全背包,物品可以使用无限次
for (int i = 1; i <= n; i++)
{
scanf("%d%d", &s, &v);
for (int j = v; j <= maxn; j++)//因为每样东西可以使用无限次,所以从v枚举到最大
{
dp[j] = min(dp[j], dp[j - v] + s);
}
}