简单的三种背包问题

01背包

给定n种物品的价值和重量,求出当背包容量为m时,能够装下的最大价值

每种物品最多只能取一次

一维的写法

dp数组代表的是当前状态能够放下的最大价值

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]);
    }
}

完全背包

给定n种物品的价值和重量,求出当背包容量为m时,能够装下的最大价值

每种物品可以取多次

一维的写法

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]);
    }
}            

01背包和完全背包的一维写法的区别在于for循环的第二层循环的遍历顺序

01背包:从m开始--

完全背包:从w[i]开始++

多重背包

猜你喜欢

转载自www.cnblogs.com/OFSHK/p/11976780.html