分组背包

题目链接

#include<cstdio>
#include<cstdlib>
using namespace std;
#define INF 100+5
const int MAXN=1000+5,MAXV=1000+5;
int max(int a,int b)
{
    return a>b?a:b;
}
int m,n,maxg;
int w[MAXN+1],p[MAXN+1];
int g[INF+1][MAXN+1];
int dp[MAXV];
int main() 
{
    int c;
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&w[i],&p[i],&c);
        g[c][++g[c][0]]=i;
        maxg=max(maxg,c);
    }
    for(int i=1;i<=maxg;i++)
        for(int j=m;j>=0;j--)
            for(int k=1;k<=g[i][0];k++)
                if(j>=w[g[i][k]])
                    dp[j]=max(dp[j],dp[j-w[g[i][k]]]+p[g[i][k]]);
    printf("%d",dp[m]);
        return 0; 
}
posted @ 2018-03-04 11:18  Lance1ot  阅读(71)  评论(0编辑  收藏  举报