1086 背包问题 V2-多重背包-深度理解

匿名 (未验证) 提交于 2019-12-02 23:00:14
  •  
  • 1086 背包问题 V2

  • 先来一发无任何优化的:
  •       for (int i=1; i<=n; i++)
  •                 f[i][0]=0;
  •             for (int j=w[i]; j<=v; j++)
  •                    int count=min(num[i],j/w[i]);
  •                 for (int k=0; k<=count; k++)
  •                         f[i][j]=max(f[i][j],f[i-1][j-k*w[i]]+k*c[i])
  • 所以我们可以根据对c[i]c[i]取模得到的余数进行分组.
  • 每组之间的状态转移不互相影响.
  • 这里一些推导过程我会写的尽量详细(我也知道看不懂有多难受. qwq
  • 令d=c[i],a=j/c[i],b=j%c[i]
  • 其中a为全选状况下的物品个数.
  • 则带入原始的状态转移方程中
  • 根据单步容斥
  • 而我们要求的状态也就变成了
  • 所以我们的要求的状态就变成了
  • 根据我们的
  • k∈[1,lim]k∈[1,lim]
  • 容易推知
  • 那么
  • (之所以为lim+1lim+1个数,是包括当前这个jj,还有前面的物品数量.)
  • 因此我们考虑到了单调队列优化
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!