洛谷 P1757 - 通天之分组背包

题目描述

P1757 通天之分组背包

解法:分组背包问题

#include <bits/stdc++.h>

using namespace std;

int m, n, cn;
int f[1010], a[1010], b[1010], c[101][20],cc[101];

int main()
{
    scanf("%d%d", &m, &n);
    for(int i=1;i<=n;i++)
    {
        int ci;
        scanf("%d%d%d", &a[i], &b[i], &ci);
        cn = max(cn, ci); // cn记录共有多少个分组
        cc[ci]++; // cc[]记录第ci组中共有几件物品
        c[ci][cc[ci]] = i; // c[][]记录第ci组中第j件物品
    }
    for(int k=1;k<=cn;k++)
        for(int j=m;j>=0;j--)
            for(int i=1;i<=cc[k];i++)
                if(j>=a[c[k][i]])
                    f[j] = max(f[j], f[j-a[c[k][i]]]+ b[c[k][i]]);
    printf("%d\n", f[m]);
    return 0;
}
发布了176 篇原创文章 · 获赞 32 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_38204302/article/details/105316146
今日推荐