zoukankan      html  css  js  c++  java
  • 01背包模板 及 优化

    1:   01背包

    模板: 注意是两个for   第一个是物品  第二个是重量 

    #include<bits/stdc++.h>
    #define int long long
    #define MAX(a,b,c) max(a,max(b,c))
    #define MIN(a,b,c) min(a,min(b,c))
    #define pb push_back
    #define fi first
    #define se second
    typedef long long ll;
    typedef long long LL;
    typedef unsigned long long ull;
    typedef unsigned long long uLL;
    using namespace std;
    const int maxn=1e5+10;
    const int INF=0x3f3f3f3f;
    int w[maxn];
    int v[maxn];
    int dp[30][maxn];
    int32_t main()
    {
        int n,m;    cin>>n>>m;
        for(int i=1;i<=m;i++) { cin>>w[i]>>v[i];   }  
        for(int i=1;i<=m;i++) // weight
        {
            for(int j=1;j<=n;j++) // things;
            {
                if(j>=w[i])
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
                else
                dp[i][j]=dp[i-1][j];
            }
        }cout<<dp[m][n];
    }
    01背包 二维模板
    #include<bits/stdc++.h>
    #define int long long
    #define MAX(a,b,c) max(a,max(b,c))
    #define MIN(a,b,c) min(a,min(b,c))
    #define pb push_back
    #define fi first
    #define se second
    typedef long long ll;
    typedef long long LL;
    typedef unsigned long long ull;
    typedef unsigned long long uLL;
    using namespace std;
    const int maxn=1e5+10;
    const int INF=0x3f3f3f3f;
    int w[maxn];
    int v[maxn];
    int dp[maxn];
    int32_t main()
    {
        int n,m;    cin>>n>>m;
        for(int i=1;i<=m;i++) { cin>>w[i]>>v[i];   }
        for(int i=1;i<=m;i++) // weight
        {
            for(int j=n;j>=w[i];j--) // things;
            {
                dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
            }
        }cout<<dp[n];
    }
    01背包 一维模板

     2 : 完全背包

    #include<bits/stdc++.h>
    #define int long long
    #define MAX(a,b,c) max(a,max(b,c))
    #define MIN(a,b,c) min(a,min(b,c))
    #define pb push_back
    #define fi first
    #define se second
    typedef long long ll;
    typedef long long LL;
    typedef unsigned long long ull;
    typedef unsigned long long uLL;
    using namespace std;
    const int maxn=1e5+10;
    const int INF=0x3f3f3f3f;
    int w[maxn];
    int v[maxn];
    int dp[30][maxn];
    int32_t main()
    {
        int n,m;    cin>>n>>m;
        for(int i=1;i<=m;i++) { cin>>w[i]>>v[i];   }
        for(int i=1;i<=m;i++) // weight
        {
            for(int j=1;j<=n;j++) // things;
            {
                if(j>=w[i])
                dp[i][j]=max(dp[i-1][j],dp[i][j-w[i]]+v[i]);
                else
                dp[i][j]=dp[i-1][j];
            }
        }cout<<dp[m][n];
    }
    完全背包 二维模板

    和01背包有所区别   

    #include<bits/stdc++.h>
    #define int long long
    #define MAX(a,b,c) max(a,max(b,c))
    #define MIN(a,b,c) min(a,min(b,c))
    #define pb push_back
    #define fi first
    #define se second
    typedef long long ll;
    typedef long long LL;
    typedef unsigned long long ull;
    typedef unsigned long long uLL;
    using namespace std;
    const int maxn=1e5+10;
    const int INF=0x3f3f3f3f;
    int w[maxn];
    int v[maxn];
    int dp[maxn];
    int32_t main()
    {
        int n,m;    cin>>n>>m;
        for(int i=1;i<=m;i++) { cin>>w[i]>>v[i];   }
        for(int i=1;i<=m;i++) // weight
        {
            for(int j=1;j<=n;j++) // things;
            {
                if(j>=w[i])
                dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
                else
                dp[j]=dp[j];
            }
        }cout<<dp[n];
    }
    完全背包 一维模板
  • 相关阅读:
    C++-类的const成员变量
    Linux-编译器gcc/g++编译步骤
    C++-理解构造函数、析构函数执行顺序
    Linux-Unix版本介绍
    C++-const_cast只能用于指针和引用,对象的const到非const可以用static_cast
    Linux-如何查看登陆shell的类型
    C++-不要在构造和析构函数中调用虚函数
    C++-模板的声明和实现为何要放在头文件中
    C++-函数模板特化如何避免重复定义
    Linux-Gcc生成和使用静态库和动态库详解
  • 原文地址:https://www.cnblogs.com/Andromeda-Galaxy/p/9428506.html
Copyright © 2011-2022 走看看