码迷,mamicode.com
首页 > 其他好文 > 详细

背包(01,完全,多重,分组)

时间:2019-10-10 20:38:10      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:ref   多重   content   const   --   lan   优化   背包   print   

01背包

#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
    int m,n,dp[100005];
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        int w,p;
        scanf("%d%d",&w,&p);
        for(int j=m;j>=w;j--)
        {
            dp[j]=max(dp[j-w]+p,dp[j]);
        }
    }
    printf("%d\n",dp[m]);
    return 0;
}

完全背包

#include <cstdio>
#include <iostream>
using namespace std;
int f[1005],v[1005],w[1005];
int main()
{
    int n,m,ans;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
      scanf("%d%d",&v[i],&w[i]);
    for(int i=1;i<=n;i++)
    {
        for(int j=v[i];j<=m;j++)
        {
            f[j]=max(f[j],f[j-v[i]]+w[i]);
        }
    }
    printf("%d\n",f[m]);
    return 0;
}

多重背包(优化)

#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int f[2005];
struct Good{
    int v,w;
};
vector <Good> goods;
int main()
{
    int n,m,ans,s,v,w;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&v,&w,&s);
        for(int k=1;k<=s;k*=2)
        {
            s-=k;
            goods.push_back({v*k,w*k});
        }
        if(s>0) goods.push_back({v*s,w*s});
    }
    for(auto good:goods)
    {
        for(int j=m;j>=good.v;j--)
        {
            f[j]=max(f[j],f[j-good.v]+good.w);
        }
    }
    printf("%d\n",f[m]);
    return 0;
}

分组背包

#include <cstdio>
#include <iostream>
const int M=1010;
using namespace std;
int main()
{
    int m,n,w[M],p[M],arr[110][M],ar[M],num=0,dp[M];
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++)
    {
        int a;
        scanf("%d%d%d",&w[i],&p[i],&a);
        num=max(num,a);
        ar[a]++;
        arr[a][ar[a]]=i;
    }
    for(int i=1;i<=num;i++)
    {
        for(int j=0;j<=m;j++)
        {
            for(int k=1;k<=ar[i];k++)
            {
                int f=arr[i][k];
                if(j+w[f]<=m)
                  dp[j]=max(dp[j],dp[j+w[f]]+p[f]);
            }
        }
    }
    printf("%d\n",dp[0]);
    return 0;
}

 混合背包

#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
const int M=1010;
using namespace std;
struct Good{
    int kind;
    int w,p;
};

vector <Good> goods;
int main()
{
    int m,n,dp[M];
    memset(dp,0,sizeof(dp));
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        int w,p,s;
        cin>>w>>p>>s;
        if(s<0)
        {
            goods.push_back({-1,w,p});
        }
        else if(s==0)
        {
            goods.push_back({0,w,p});
        }
        else
        {
            for(int k=1;k<=s;k*=2)
            {
                s-=k;
                goods.push_back({-1,w*k,p*k});
            }
            if(s>0)
            goods.push_back({-1,w*s,p*s});
        }
    }
    for(auto good:goods)
    {
        if(good.kind<0)
        {
            for(int j=m;j>=good.w;j--)
                dp[j]=max(dp[j],dp[j-good.w]+good.p);
        }
        else
        {
            for(int j=good.w;j<=m;j++)
                dp[j]=max(dp[j],dp[j-good.w]+good.p);
        }
    }
    cout<<dp[m]<<endl;
    return 0;
}

 

背包(01,完全,多重,分组)

标签:ref   多重   content   const   --   lan   优化   背包   print   

原文地址:https://www.cnblogs.com/zptcszj/p/11643836.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!