时间复杂度o(Nlogs1v)
二进制优化将n种物品,每种Si个的多重背包,拆分打包看成N件物品(组)的01背包问题
2000=1+2+4+…+2^9+c,所以最多11*1000件物品
不能用完全背包的优化方式优化多重背包,因为每种数目不是无限的
#include<iostream>
using namespace std;
const int N=11010,M=2010;
int n,m;
int v[N],w[N];
int f[M];
int main()
{
cin>>n>>m;
int cnt=1;
for(int i=1;i<=n;i++)//拆分打包
{
int a,b,s;
cin>>a>>b>>s;
int k=1;
while(k<=s)
{
v[cnt]=a*k;
w[cnt]=b*k;
s-=k;
k*=2;
cnt++;
}
if(s>0)
{
v[cnt]=s*a;
w[cnt]=s*b;
cnt++;
}
}
for(int i=1;i<=cnt;i++)
{
for(int j=m;j>=v[i];j--)
{
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[m]<<endl;
return 0;
}
看了好多篇不知道为什么开N=11e3+10,终于在这里看明白了
```cpp
#include[HTML_REMOVED]
#include[HTML_REMOVED]
#include[HTML_REMOVED]
using namespace std;
const int N = 2010;
int f[N],vv[N],ww[N];
int main() {
int n, m;
scanf(“%d%d”,&n,&m);
}```
这个为什么测试数据都能过,但是一提交就过不了
```cpp
#include[HTML_REMOVED]
#include[HTML_REMOVED]
#include[HTML_REMOVED]
using namespace std;
const int N = 2010;
int f[N],vv[N],ww[N];
int main() {
int n, m;
scanf(“%d%d”,&n,&m);
}```
这个为什么测试数据都能过,但是一提交就过不了
代码中间不是都把v[i]累加起来了吗 ,v[i]=ka;w[i]=kb;
怎么表示一个数啊,不是都加起来了吗
各位大佬,这里cnt为什么还要++呢
因为前面的物品数量s还有剩,不能被2的幂完整地减完,还剩下一部分,单独打包成一份,而cnt就是最终打包出来地数量,因此单独打包地那一部分也需要让cnt++
s大于0,不就是有剩余吗,while循环已经给cnt加过了,if只是判断还有没有剩余,为什么这个地方还要再加一次
顶!
厉害了,请问佬这个ppt是哪里的?
牛逼
我菜鸡。。。
强
qp