混合背包(不完美的、比较low的)

来源:互联网 发布:淘宝客定向计划描述 编辑:程序博客网 时间:2024/06/04 19:14

主要是:将多重背包拆成01背包。

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<queue>using namespace std;int w[3000],c[3000],p[3000],f[3000];int main(){    //freopen("mix.in","r",stdin);    //freopen("mix.out","w",stdout);    int n,m;    int ln=0;    scanf("%d%d",&m,&n);    for(int i=1;i<=n;i++)    {        int w0,c0,p0;        scanf("%d%d%d",&w0,&c0,&p0);        if(p0>1)        {            while(p0>0)//次数要弄对,拆成01背包            w[++ln]=w0,c[ln]=c0,p[ln]=1,p0--;        }        else        {            w[++ln]=w0;            c[ln]=c0;            p[ln]=p0;        }    }    for(int i=1;i<=ln;i++)    {        if(p[i]==1)        {            for(int j=m;j>=w[i];j--)            f[j]=max(f[j],f[j-w[i]]+c[i]);        }        else        if(p[i]==0)        {            for(int j=w[i];j<=m;j++)            f[j]=max(f[j],f[j-w[i]]+c[i]);        }    }    printf("%d",f[m]);    fclose(stdin);fclose(stdout);    return 0;} 
1 0
原创粉丝点击