P1757 通天之分组背包

发布时间 2023-08-24 00:45:15作者: 失控D大白兔

自 01背包问世之后,小 A 对此深感兴趣。一天,小 A 去远游,却发现他的背包不同于 01 背包,
他的物品大致可分为 k 组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少。

1. 动态规划

分组背包

int maxval(int v,vector<int>&c,vector<int>&w,vector<int>&group){ 
    int n = c.size();
    vector<int> dp(v+1);
    vector<int> idxs[101];//对应组别的索引
    for(int i=0;i<n;i++)
        idxs[group[i]].push_back(i);
    int res = 0;
    for(int i=0;i<101;i++){//遍历组
        if(idxs[i].size()==0) continue;
        for(int j=v;j>=0;j--){
            for(auto idx:idxs[i]){//遍历组内物品
                if(j>=c[idx])
                    dp[j] = max(dp[j],dp[j-c[idx]]+w[idx]);
            }
            res = max(res,dp[j]);
        }
    }
    return res;
}