洛谷【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\n",f[m]);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/AKMer/p/10437699.html