-
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,还有前面的物品数量.)
- 因此我们考虑到了单调队列优化
转载请标明出处:1086 背包问题 V2-多重背包-深度理解
文章来源: 1086 背包问题 V2-多重背包-深度理解