背包问题(模板)

简介: 背包问题(模板)

01背包


从最大容量开始遍历到当前,防止重复

void solve()
{
  int n,m,v,w;
  cin>>n>>m;
  for(int i=1;i<=n;i++)
  {
    cin>>v>>w;
    for(int j=m;j>=v;j--)
    {
      dp[j]=max(dp[j],dp[j-v]+w);
    }
  }
  cout<<dp[m]<<endl;
  return ;
}


完全背包


从当前容量遍历到最大,与01背包恰好相反

void solve()
{
  int n,m,v,w;
  cin>>n>>m;
  for(int i=1;i<=n;i++)
  {
    cin>>v>>w;
    for(int j=v;j<=m;j++)
    {
      dp[j]=max(dp[j],dp[j-v]+w);
    }
  }
  cout<<dp[m]<<endl;
  return ;
}


多重背包(范围0-100):


范围小的时候适用,将有数量都转为1,转化为01背包

void solve()
{
  int n,m,v[101001],w[101001],ans=1,a,b,c;
  cin>>n>>m;
  for(int i=1;i<=n;i++)
  {
    cin>>a>>b>>c;
    for(int j=1;j<=c;j++)
    {
      v[ans]=a;
      w[ans]=b;
      ans++;
    }
  }
  for(int i=1;i<=ans;i++)
  {
    for(int j=m;j>=v[i];j--)
    {
      dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
    }
  }
  cout<<dp[m]<<endl;
  return ;
}


混合背包:


void solve()
{
  int n,m;
  cin>>n>>m;
    for (int i=1;i<=n;i++) 
    {
        int v,w,s;
        cin>>v>>w>>s;
        if(s==0)//当完全背包做
        {
            for(int j=v;j<=m;j++) 
            dp[j] = max(dp[j],dp[j-v]+w);
        }
        else //转化为01背包
        {
            if(s==-1)
            s=1;
            for(int k=1;k<=s;k<<=1)
            {
              for(int j=m;j>=v*k;j--)
              {
                dp[j]=max(dp[j],dp[j-v*k]+w*k);
        }
        s-=k;
      }
      if(s)
      {
        for(int j=m;j>=s*v;j--)
        {
           dp[j]=max(dp[j],dp[j-v*s]+w*s);  
        }
      }
        }
    }
    cout<<dp[m]<<endl; 
  return ;
}


分组背包:


signed main()
{
  int n,m,s,w[1010],v[1010];
  cin>>n>>m;
  while(n--)
  {
  cin>>s;
  for(int i=1;i<=s;i++)
  cin>>v[i]>>w[i];
  for(int j=m;j>=0;j--)
  {
    for(int k=1;k<=s;k++)
    {
    if(j>=v[k])
    dp[j]=max(dp[j],dp[j-v[k]]+w[k]);
    }
  }
  }
  cout<<dp[m]<<endl;
  return 0;
}


二维费用的背包问题:


除体积限制外多了质量限制

void solve()
{
  int n,v,m;
  cin>>n>>v>>m;
    for (int i=1;i<=n;i++) 
    {
        int a,b,w;
        cin>>a>>b>>w;
        for(int j=v;j>=a;j--)
        {
          for(int k=m;k>=b;k--)
          {
            dp[j][k]=max(dp[j][k],dp[j-a][k-b]+w);
      }
    }
    }
    cout<<dp[v][m]<<endl; 
  return ;
}


背包问题求方案数:


signed main()
{
  int n,m,v,w;
  cin>>n>>m;
  for(int i=0;i<=m;i++)
  cnt[i]=1;
  for(int i=1;i<=n;i++)
  {
    cin>>v>>w;
    for(int j=m;j>=v;j--)
    {
      int t=dp[j-v]+w;
      if(t>dp[j])
      {
        dp[j]=t;
        cnt[j]=cnt[j-v];
      }
      else if(t==dp[j])
      {
        cnt[j]=(cnt[j]+cnt[j-v])%mod;
      }
    }
  }
  cout<<cnt[m]<<endl;
  return 0;
}

相关文章
数据治理:数据集成
数据治理:数据集成
219 11
C++ 之 perf+火焰图分析与调试
简介 在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。 1. Perf 基础 1.1 Perf 简介 perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。利用perf剖析程序性能时,需要指定当前测试的性能时间。性能事件是指在处理器或操作系统中发生的,可能影响到程序性能的硬件事件或软件事件 1.2 Perf的安装 ubuntu 18.04: sudo apt install linux-tools-common linux-tools-4.15.0-106-gen
274 2
怎么使用Python轻松打造淘宝主图视频生成神器
怎么使用Python轻松打造淘宝主图视频生成神器
227 0
深度剖析 RocketMQ 5.0,架构解析:云原生架构如何支撑多元化场景?
了解 RocketMQ 5.0 的核心概念和架构概览;然后我们会从集群角度出发,从宏观视角学习 RocketMQ 的管控链路、数据链路、客户端和服务端如何交互;学习 RocketMQ 如何实现数据的存储,数据的高可用,如何利用云原生存储进一步提升竞争力。
142348 3
阿里云ARM计算架构云服务器最新收费标准与活动价格表参考
ARM计算架构阿里云服务器有计算型c8y、通用型g8y、内存型r8y、ARM 通用型g6r、ARM 计算型c6r等实例规格可选,不同实例规格的租用收费价格是不一样的,本文为大家汇总了目前基于ARM计算架构下的各个实例规格的阿里云服务器收费标准,以供参考。
阿里云ARM计算架构云服务器最新收费标准与活动价格表参考
在云服务器ECS上搭建个人网站
本实验帮助您快速了解云上应用的构建方式,同时通过您可以采取的工具、方法和可操作步骤,以帮助您了解如何便捷的搭建属于自己的云上应用。
angular实现全选,反选,批量删除,删除,全不选,倒序,模糊查找等功能
angular实现全选,反选,批量删除,删除,全不选,倒序,模糊查找等功能
142 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问