zoukankan      html  css  js  c++  java
  • 背包

    1.0/1背包

    #include <bits/stdc++.h>
    
    using namespace std;
    
    #define ll long long 
    #define INF 0x3f3f3f3f
    #define MAXN 300010
    #define MAXM 3010
    
    inline int read() {
        int x = 0,ff = 1;char ch = getchar();
        while(!isdigit(ch)) {
            if(ch == '-') ff = -1;
            ch = getchar();
        }
        while(isdigit(ch)) {
            x = (x << 1) + (x << 3) + (ch ^ 48);
            ch = getchar();
        }
        return x * ff;
    }
    
    int V,n,ans,weigh[MAXN],value[MAXN],f[MAXN];
    
    int main() {
        V = read(); n = read();
        for(int i = 1; i <= n; ++i) {
            weigh[i] = read();
            value[i] = read();
        }
        for(int i = 1; i <= n; ++i) {
            for(int j = V; j >= weigh[i]; --j) {
                f[j] = max(f[j],f[j - weigh[i]] + value[i]);
            }
        }
        for(int i = 1; i <= V; ++i)
            ans = max(ans,f[i]);
        printf("%d
    ",ans);
    }

    2.完全背包

    #include <bits/stdc++.h>
    
    using namespace std;
    
    #define ll long long 
    #define INF 0x3f3f3f3f
    #define MAXN 300010
    #define MAXM 3010
    
    inline int read() {
        int x = 0,ff = 1;char ch = getchar();
        while(!isdigit(ch)) {
            if(ch == '-') ff = -1;
            ch = getchar();
        }
        while(isdigit(ch)) {
            x = (x << 1) + (x << 3) + (ch ^ 48);
            ch = getchar();
        }
        return x * ff;
    }
    
    int V,n,ans,f[MAXN],v[MAXN],w[MAXN];
    
    int main() {
        V = read(); n = read();
        for(int i = 1; i <= n; ++i) {
            w[i] = read(); v[i] = read();
        }
        for(int i = 1; i <= n; ++i) {
            for(int j = w[i]; j <= V; ++j) {
                f[j] = max(f[j],f[j - w[i]] + v[i]);
            }
        }
        for(int i = 1; i <= V; ++i) 
            ans = max(ans,f[i]);
        printf("%d
    ",ans);
    }

    3.多重背包

    #include <bits/stdc++.h>
    
    using namespace std;
    
    #define ll long long
    #define INF 0x3f3f3f3f
    #define MAXN 300010
    #define MAXM 3010
    
    inline int read() {
        int x = 0,ff = 1;char ch = getchar();
        while(!isdigit(ch)) {
            if(ch == '-') ff = -1;
            ch = getchar();
        }
        while(isdigit(ch)) {
            x = (x << 1) + (x << 3) + (ch ^ 48);
            ch = getchar();
        }
        return x * ff;
    }
    
    int N,V,ans,w[MAXN],v[MAXN],n[MAXN],f[MAXM][MAXM];
    
    int main() {
        N = read(); V = read();
        for(int i = 1; i <= N; ++i) {
            n[i] = read();
            w[i] = read();
            v[i] = read();
        } 
        for(int i = 1; i <= N; ++i) {
            for(int k = 0; k <= n[i]; ++k){
                for(int j = k * w[i]; j <= V; ++j) {    
                    f[i][j] = max(f[i][j],f[i - 1][j - k * w[i]] + k * v[i]);    
                }
            }
        }
        for(int i = 1; i <= V; ++i) 
            ans = max(ans,f[N][i]);
        printf("%d
    ",ans);
        return 0;
    }

     二进制优化:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    #define ll long long
    #define INF 0x3f3f3f3f
    #define MAXN 300010
    #define MAXM 3010
    
    template <typename T> inline void read(T &x) {
        x = 0;
        T ff = 1;char ch = getchar();
        while(!isdigit(ch)) {
            if(ch == '-') ff = -1;
            ch = getchar();
        }
        while(isdigit(ch)) {
            x = (x << 1) + (x << 3) + (ch ^ 48);
            ch = getchar();
        }
        x *= ff;
    }
    
    int N,V,size;
    ll w[MAXN],v[MAXN],n[MAXN],f[MAXN],ans;
    
    int main() {
        read(N); read(V);
        for(int i = 1; i <= N; ++i) {
            int x,y,z,t = 1; // n,w,v;
            read(x); read(y); read(z);
            while(t <= x) {
                w[++size] = y * t;
                v[size] = z * t;
                x -= t;
                t <<= 1;
            }
            if(x > 0) {
                w[++size] = y * x;
                v[size] = z * x;
            }
        }
        for(int i = 1; i <= size; ++i) {
            for(int j = V; j >= w[i]; --j) {
                f[j] = max(f[j],f[j - w[i]] + v[i]);
            }
        }
        for(int i = 1; i <= V; ++i)
            ans = max(ans,f[i]);
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    利用arcserver 自带tomcat实现上传shapefile、cad等文件,然后用soe解析。
    Linux下ls命令显示符号链接权限为777的探索
    HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(一)
    利用Python sklearn的SVM对AT&T人脸数据进行人脸识别
    使用sklearn构建含有标量属性的决策树
    SEED缓冲区溢出实验笔记——Return_to_libc
    Python写的嗅探器——Pyside,Scapy
    PySide——Python图形化界面入门教程(六)
    PySide——Python图形化界面入门教程(五)
    PySide——Python图形化界面入门教程(四)
  • 原文地址:https://www.cnblogs.com/AK-ls/p/10592546.html
Copyright © 2011-2022 走看看