分组背包 洛谷P1757 通天值分组背包

题目链接:https://www.luogu.org/problem/P1757

最基础的分组背包,码在这里

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int dp[1010];
int a[1010],b[1010],c[1010],d[1010],f[1010][1010];
int main(){
    int m,n;cin>>m>>n;
    int num=0;//存的是组的数目 
    for(int i=1;i<=n;i++){
        scanf("%d%d%d",&a[i],&b[i],&c[i]);
        num=max(num,c[i]);
        d[c[i]]++;//第c[i]组的物品个数增加
        f[c[i]][d[c[i]]]=i;//第几组的第几个的序号是多少 
    }
    for(int i=1;i<=num;i++){//枚举组的数目 
        for(int j=m;j>=0;j--){
            for(int k=1;k<=d[i];k++){//依次枚举第i组的第几个 
                if(j>=a[f[i][k]])
                dp[j]=max(dp[j],dp[j-a[f[i][k]]]+b[f[i][k]]);
            }
        } 
    }
    cout<<dp[m]<<endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/qingjiuling/p/11354869.html