背包问题
1,01背包
背包问题的基础,总体积为V的背包,有n件体积v【i】,价值w【i】的物品,求能装物品的最大总价值
void zero(int v,int w)
{
for(int j=V;j>=v;j--)
{
dp[j]=max(dp[j],dp[j-v]+w);
}
return ;
}
2.完全背包,每件物品能选无数个
void complete(int v,int w)
{
for(int j=v;j<=V;j++)
{
dp[j]=max(dp[j],dp[j-v]+w);
}
return ;
}
3.多重背包,每件物品能选的数量有限制,最多c【i】个
二进制优化:
二进制优化的思想还是很巧妙的,根据c【i】得到一组这样的数 2^0,2^1,2^2,2^3.....2^(k-1) , c-2^k+1 其中k是满足2^k小于c的最大值,就像c=7=111,2^k=100=4 ;
c=9=1001, 2^k=1000=8 ; c=8=1000 2^k=0100=4
得到这组数的目的是什么呢,