分组背包(每组至少选择一件物品)

来源:互联网 发布:淘宝关键词查询 编辑:程序博客网 时间:2024/05/29 13:25

题意:有n双鞋,a,b,c分别代表型号,价格和舒适度,当拥有m元时,每个型号的鞋至少买一双的最大舒适度是多少?

#include"stdio.h"#include"string.h"#include"stdlib.h"#include"algorithm"#include"math.h"#include"vector"#define M 109#define inf -0x3f3f3f3f#define eps 1e-10#define PI acos(-1.0)using namespace std;int dp[19][10009];struct node{    int v,p;    node(){}    node(int vv,int pp){v=vv;p=pp;}};vector<node>s[M];int main(){    int n,m,K,i,a,b,c,j,k;    while(scanf("%d%d%d",&n,&m,&K)!=-1)    {        for(i=0;i<=K;i++)            s[i].clear();        for(i=1;i<=n;i++)        {            scanf("%d%d%d",&a,&b,&c);            s[a].push_back(node(b,c));        }        int flag=0;        for(i=1;i<=K;i++)        {            if((int)s[i].size()==0)                flag++;        }        if(flag)        {            printf("Impossible\n");            continue;        }        memset(dp,-1,sizeof(dp));        for(i=0;i<=m;i++)            dp[0][i]=0;        for(i=1;i<=K;i++)        {            for(j=0;j<(int)s[i].size();j++)            {                int v=s[i][j].v;                int p=s[i][j].p;                for(k=m;k>=v;k--)                {                    if(dp[i-1][k-v]!=-1)                    {                        dp[i][k]=max(dp[i][k],dp[i][k-v]+p);                        dp[i][k]=max(dp[i][k],dp[i-1][k-v]+p);                    }                }            }        }        /*for(i=1;i<=K;i++)        {            for(j=0;j<=m;j++)                printf("%d %d %d\n",i,j,dp[i][j]);        }*/        if(dp[K][m]<0)            printf("Impossible\n");        else        printf("%d\n",dp[K][m]);    }    return 0;}


0 0
原创粉丝点击