zoukankan      html  css  js  c++  java
  • 洛谷【P1757】通天之分组背包

    浅谈(DP)https://www.cnblogs.com/AKMer/p/10437525.html

    题目传送门:https://www.luogu.org/problemnew/show/P1757

    分组背包,把一组物品看做是一个物品,不过这个物品可以有很多种变幻,然后像(01)背包一样做,每次选择所有的变幻即可。

    时间复杂度:(O(nm))

    空间复杂度:(O(m))

    代码如下:

    #include <cstdio>
    #include <vector>
    #include <algorithm>
    using namespace std;
    typedef pair<int,int> pii;
    #define ff first
    #define ss second
    
    const int maxn=1005,maxm=1005;
    
    int n,m;
    int f[maxm];
    vector<pii>s[105];
    vector<pii>::iterator it;
    
    int read() {
        int x=0,f=1;char ch=getchar();
        for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
        for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
        return x*f;
    }
    
    int main() {
        m=read(),n=read();
        for(int i=1;i<=n;i++) {
            int a=read(),b=read(),t=read();
            s[t].push_back(make_pair(a,b));
        }
        for(int i=1;i<=100;i++)
            for(int j=m;j;j--)
                for(it=s[i].begin();it!=s[i].end();it++) {
                    int a=(*it).ff,b=(*it).ss;
                    if(j<a)continue;
                    f[j]=max(f[j],f[j-a]+b);
                }
        printf("%d
    ",f[m]);
        return 0;
    }
    
  • 相关阅读:
    10.28作业
    10.27作业
    10.26作业
    10.22作业
    10.20作业
    10.19作业
    10.16作业
    10.15作业
    10.14作业
    10.13作业
  • 原文地址:https://www.cnblogs.com/AKMer/p/10437699.html
Copyright © 2011-2022 走看看