(ssl 2301)混合背包

来源:互联网 发布:超链接宣传单制作软件 编辑:程序博客网 时间:2024/06/10 14:48

混合背包&混合背包

题意:n个物品,v公斤的背包,第i件物品重量w[i],价值c[i],最多件数p[i],在不超过背包容量的情况下,使总价值最大。

(p[i]=0):完全背包,(p[i]=1):01背包,(p[i]>1):多重背包。

分析:首先要分成两个部分:完全背包和多重背包(01背包=1重背包)。

代码如下: (时间复杂度O(n*m*∑p[i]))

  • #include <cstdio>#include <algorithm>using namespace std;int f[201],w[31],m,n,c[31],p[31];int main(){scanf("%d%d",&m,&n);for (int i=1;i<=n;i++)scanf("%d%d%d",&w[i],&c[i],&p[i]);for (int i=1;i<=n;i++)if (!p[i]){ //完全背包for (int j=w[i];j<=m;j++)f[j]=max(f[j],f[j-w[i]]+c[i]);}else { //多重背包for (int j=1;j<=p[i];j++)for (int k=m;k>=w[i];k--)f[k]=max(f[k],f[k-w[i]]+c[i]);}printf("%d",f[m]); return 0;}


原创粉丝点击