
1.普通01背包问题解法
#include<iostream>
using namespace std;
const int N=105;
int f[N],w[N],v[N],s[N];
int main()
{
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++) cin>>v[i]>>w[i]>>s[i];
for(int i=1;i<=n;i++)
for(int j=m;j>=1;j--)
{
for(int k=1;k<=s[i]&&v[i]*k<=j;k++)
f[j]=max(f[j],f[j-k*v[i]]+k*w[i]);
}
cout<<f[m];
}
2.二进制优化多重背包问题
显然三重循环10的9次方会超时,那么我们可以将第i种物s个数量用二进制分解成log(s)堆,例如10可分解成1,2,4,3;这四个数包含了1-10的任意一种组合,以下就是详细代码了
#include<iostream>
using namespace std;
const int N=2e6+5;
int v[N],w[N],f[N],cnt;
int main()
{
int n,m;cin>>n>>m;
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;
}
if(s)
{
v[++cnt]=a*s;
w[cnt]=b*s;
}
}
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];
}
本文介绍了如何使用C++编程解决01背包问题和通过二进制优化算法处理多重背包问题,通过二进制分解减少循环次数,降低时间复杂度,以避免超时。
&spm=1001.2101.3001.5002&articleId=135477183&d=1&t=3&u=d922664290d7443480552576bed3a933)
2882

被折叠的 条评论
为什么被折叠?



