【题解】luogu P1757 通天之分组背包

分组背包类型

总结:

1.先循环体积,再循环每组内的物品,保证每组物品内只选一次。

 若调换位置,有可能每组内物品多选了。

2.num数组记录每组有多少个物品;

 belong数组记录每组物品的每一个物品的序列号是多少

很巧妙的方法

#include<bits/stdc++.h>
using namespace std;
int dp[1005], val[1005], w[1005], num[1005], belong[101][20];
int maxx, m, n, a, b, c;
int main()
{
    cin >> m >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> a >> b >> c;
        val[i] = b;
        w[i] = a;
        maxx = max(maxx, c);
        num[c]++;
        belong[c][num[c]] = i;
    }
    for(int i = 1; i <= maxx; i++)
        for(int j = m; j >= 0; j--)
            for(int k = 1; k <= num[i]; k++)
            if(j >= w[belong[i][k]])
                dp[j] = max(dp[j], dp[j-w[belong[i][k]]]+val[belong[i][k]]);
    cout << dp[m];
    return 0;
}

 

posted @ 2019-08-13 20:35  ATKevin  阅读(143)  评论(0编辑  收藏  举报