首页 > 其他分享 >背包问题

背包问题

时间:2023-01-06 10:44:05浏览次数:34  
标签:main 背包 int namespace 问题 include 1001

01背包

#include<bits/stdc++.h>
using namespace std;
int n,m,f[1001],v[1001],w[1001];
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>v[i]>>w[i];
    
    for(int i=1;i<=n;i++)
    {
        for(int j=m;j>=v[i];j--)
        f[j]=max(f[j-v[i]]+w[i],f[j]);
    }
    cout<<f[m];
}

完全背包

#include<bits/stdc++.h>
using namespace std;
int n,m,f[1001],v[1001],w[1001];
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>v[i]>>w[i];
    
    for(int i=1;i<=n;i++)
    {
        for(int j=v[i];j<=m;j++)
        f[j]=max(f[j-v[i]]+w[i],f[j]);
    }
    cout<<f[m];
}

多重背包(easy

#include<bits/stdc++.h>
using namespace std;
int n,m,f[1001],v[101],w[101],l[101];
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>v[i]>>w[i]>>l[i];
    
    for(int i=1;i<=n;i++)
        for (int k = 1; k <= l[i];k++)
            for (int j = m; j >= v[i]; j--)
                f[j] = max(f[j - v[i]] + w[i], f[j]);
    cout<<f[m];
}

多重背包(hard

#include<bits/stdc++.h>
using namespace std;
const int N=2001;
int n, m, f[N], v[N], w[N], l[N];

int qpow(int x,int k)
{
    int ans=1;
    while(k)
    {
        if(k&1) ans*=x;
        x*=x;
        k>>=1;
    }
    return ans;
}

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n;i++)
    {
        cin >> v[i] >> w[i] >> l[i];
    }
    for (int i = 1; i <= n;i++)
    {
        int res = l[i];
        for (int k = 1; k <= res; res -= k, k *= 2)
        {
            for (int j = m; j >= v[i] * k;j--)
            {
                f[j] = max(f[j], f[j - v[i] * k] + w[i] * k);
            }
            
        }
        for (int j = m; j >= v[i] * res;j--)
            {
                f[j] = max(f[j], f[j - v[i] * res] + w[i] * res);
            }
    }
    cout << f[m] << endl;
    return 0;
}


01背包边界是 最后一个物品取或不取:取得话 就是f[i-1][j-v[i]]+w[i] 不取就是f[i-1][j]; 滚动数组实现 因为是一维 所以先小的被更改 但是要用到原先的数据 所以从大到小枚举
完全背包边界是 最后一个物品取或不去 取得话 就是f[i][j-v[i]]+w[i] 不取就是f[i-1][j]; 也是滚动数组实现 因为是一维 但是 边界是用的第i个 所以从小到大枚举
多重背包easy 就是 把1类物品多个 看成多个一样的物品 比如 x个1 那就是 1 1 1 1...1 然后当作01背包来写
多重背包hard 就是 借助二进制分配(一个数字 肯定能用一堆2的次幂的数字来表示 比如 3=1+2 9=1+2+4+2


标签:main,背包,int,namespace,问题,include,1001
From: https://www.cnblogs.com/Szang/p/17029756.html

相关文章

  • idea乱码问题
    idea乱码问题首先​ 看自己jdk是不是openjdk18,是的换建议换17或者其他版本,倒腾一早上发现是版本问题其次如果是maven项目的话可以在pom.xml配置文件中添加如下代码......
  • 单调队列优化的DP问题
    单调队列优化的DP问题概述单调队列就是通过排除求最值时候的冗余,从而是队列具有性质,可以方便求解问题。DP的两个阶段:朴素DP的基本原理——闫氏DP分析法对朴素DP进行......
  • golang中tcp socket粘包问题和处理
    ​​http://www.01happy.com/golang-tcp-socket-adhere/​​在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格式是一个json......
  • SQL Server技术问题之触发器优缺点
    优点:1.强化约束:强制复杂业务的规则和要求,能实现比check语句更为复杂的约束。2.跟踪变化:触发器可以侦测数据库内的操作,从而禁止数据库中未经许可的更新和变化。......
  • 解决AMD Software提示和驱动程序版本不匹配问题
    解决AMDSoftware提示和驱动程序版本不匹配问题最近遇到了amdsoftware无法打开的问题,提示software和驱动程序版本不匹配。网上搜到的方法大都治标不治本,尝试各种方法后......
  • 魔术球问题
    P2765魔术球问题关键1.问题的转换2.路径的记录3.枚举的区间代码#include<bits/stdc++.h>usingnamespacestd;constintN=10005,M=1e6+5;constintinf=1e9;......
  • P2754 [CTSC1999]家园 / 星际转移问题
    P2754[CTSC1999]家园/星际转移问题关键一个是需要建立分层图,但是分层图如何建立?使用一个while循环,对每次的人数跑一次就可以了挺奇妙的代码#include<bits/stdc++......
  • ros2的cv_bridge库opencv版本不匹配问题
    ros2的cv_bridge库opencv版本不匹配问题问题:libopencv_imgcodecs.so.4.2:cannotopensharedobjectfile:nosuchfileordirectory原因ros安装的时候默认的......
  • git pull和push的时候ssl有问题
    网上搜到了2篇解决问题的blog,先收藏先https://www.jianshu.com/p/628342f01768https://tangly1024.com/article/git-ssl-error......
  • C语言指针常见问题
    我们在学C语言时,指针是我们最头疼的问题之一,针对C语言指针,博主根据自己的实际学到的知识以及开发经验,总结了以下使用C语言指针时常见问题。指针指针做函数参数学习......