• 二维背包(两个限制条件)


    NN 件物品和一个容量是 VV 的背包,背包能承受的最大重量是 MM 。

    每件物品只能用一次。体积是 vivi ,重量是 mimi ,价值是 wiwi 。

    求解将哪些物品装入背包,可使物品总体积不超过背包容量,总重量不超过背包可承受的最大重量,且价值总和最大。
    输出最大价值。

    输入格式

    第一行两个整数,NV,MN,V,M ,用空格隔开,分别表示物品件数、背包容积和背包可承受的最大重量。

    接下来有 NN 行,每行三个整数 vi,mi,wivi,mi,wi ,用空格隔开,分别表示第 ii 件物品的体积、重量和价值。

    输出格式

    输出一个整数,表示最大价值。

    数据范围

    0<N10000<N≤1000
    0<V,M1000<V,M≤100
    0<vi,mi1000<vi,mi≤100
    0<wi10000<wi≤1000

    输入样例

    4 5 6
    1 2 3
    2 4 4
    3 4 5
    4 5 6
    

    输出样例:

    8
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define HEAP(...) priority_queue<__VA_ARGS__ >
    #define heap(...) priority_queue<__VA_ARGS__,vector<__VA_ARGS__ >,greater<__VA_ARGS__ > >
    template<class T> inline T min(T &x,const T &y){return x>y?y:x;}
    template<class T> inline T max(T &x,const T &y){return x<y?y:x;}
    ll read(){ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar();if(c == '-')Nig = -1,c = getchar();while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();return Nig*x;}
    #define read read()
    const ll inf = 1e18;
    const int INF=0x3f3f3f3f;
    const int maxn = 1e5 + 7;
    const int mod = 1e9 + 7;
    const int N = 1000;
    int f[N][N];
    int main()
    {
        int n,v,w;
        cin>>n>>v>>w;
        for(int i=1;i<=n;i++){
            int a,b,c;
            cin>>a>>b>>c;
            for(int j=v;j>=a;j--)
                for(int k=w;k>=b;k--){
                    f[j][k]=max(f[j][k],f[j-a][k-b]+c);
                }
            }
        printf("%d",f[v][w]);    
        return 0;
    }
  • 相关阅读:
    GRUB引导——menu.lst的写法
    条形码类型及常见条形码介绍
    Tmux:终端复用器
    find+*的问题
    find命令之exec
    Linux core 文件介绍
    C语言中返回字符串函数的四种实现方法
    C语言中的volatile
    Stars
    Game with Pearls
  • 原文地址:https://www.cnblogs.com/lipu123/p/12185174.html
Copyright © 2020-2023  润新知