动态规划之背包DP专题
背包九讲链接
背包问题模板
int v,j; //v:总容量
int dp[Maxv]; //c:体积 w:价值 n:数量
void zobag(int c,int w)//01背包
{
for(j=v;j>=c;j--)
dp[j]=Max(dp[j],dp[j-c]+w);
}
void combag(int c,int w)//完全背包
{
for(j=c;j<=v;j++)
dp[j]=Max(dp[j],dp[j-c]+w);
}
void multibag(int c,int w,int n)//多重背包
{
if(c*n>v) //当物品的总容量大于背包的总容量时,相当于完全背包
combag(c,w);
else //转换为01背包,二进制思想优化(例:13可以分为 1(2^0)、2(2^1)、4(2^2)、6,
//因为1、2、4、6这四个数可以组合成1—13中的所有数字)
{
int k=1;
while(k<n)
{
zobag(c*k,w*k);
n-=k;
k*=2;
}
zobag(c*n,w*n);
}
}
SSOI题目传送门:
【最大约数和】
【宝石手镯】
【宝石手镯(2)】
【垃圾陷阱】
【完全背包】
【股票市场】
【Round Subset】
【消失之物】
【购买大米】
【宝石分组】
【金明的预算方案】
【课程分配】
【搭配购买】