void wanquan(int v,int w,int m) //完全背包
{
for(int j=v;j<=m;j++)
dp[j]=max(dp[j],dp[j-v]+w);
}
void zo(int v,int w,int m) //01背包
{
//for(int i=M;i>0;--i)需要开二维时用到
for(int j=m;j>=v;--j)
{
dp[j]=max(dp[j],dp[j-v]+w);
}
}
void duochong(int v,int w,int m,int c) //多重背包
{
if(v*c>=m)
wanquan(v,w,m);
else
{ //二进制优化
int k=1;
while(k<c)
{
zo(k*v,k*w,m);
c-=k;
k*=2;
}
zo(c*v,c*w,m);
}
}
//v为花费,w为价值,m为可用总费用,c为数量;注意初始化时负值情况。