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

题意:有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
");
            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
",i,j,dp[i][j]);
        }*/
        if(dp[K][m]<0)
            printf("Impossible
");
        else
        printf("%d
",dp[K][m]);

    }
    return 0;
}


原文地址:https://www.cnblogs.com/mypsq/p/4348099.html