hdu 3033 I love sneakers!(分组背包)

http://acm.hdu.edu.cn/status.php?user=515982859&pid=3033&status=5

 

题意: 有n个产品 m金额 k种品牌

          每个产品 属于 a 品牌  b的价格 且具有c的价值量

          问 在每种品牌至少买一个产品的情况下 最大价值量是多少

思路:          

          if(dp[i-1][h-p[i][j].w]>=0)   //前i个品牌 加上当年品牌 前j个 的最大价值量

                    {

                        dp[i][h]=max(dp[i][h],dp[i-1][h-p[i][j].w]+p[i][j].v); dp[i-1][h]=max(dp[i-1][h],dp[i-1][h-p[i][j].w]+p[i][j].v); }

 

 

#include<cstdio>

#include<cstring>

#include<vector>

#include<iostream>

#include<algorithm>

using namespace std;

struct Pro

{

    int w,v;

};

int dp[20][10000+100];

int main()

{

    //freopen("output.txt","w",stdout);

    int n,m,k;

    int i,j,h;

    int b,w,v;

    while(scanf("%d%d%d",&n,&m,&k)!=EOF)

    {

        vector<Pro> p[20];

        for(i=1;i<=n;i++)

        {

            scanf("%d%d%d",&b,&w,&v);

            Pro temp;

            temp.w=w;

            temp.v=v;

            p[b].push_back(temp);

        }

        memset(dp,-1,sizeof(dp));

        dp[0][0]=0;

        for(i=1;i<=k;i++)

        {

            for(j=0;j<p[i].size();j++)

            {

                for(h=m;h>=p[i][j].w;h--)

                {

                    if(dp[i-1][h-p[i][j].w]>=0)

                    {

                        dp[i][h]=max(dp[i][h],dp[i-1][h-p[i][j].w]+p[i][j].v);

                        dp[i-1][h]=max(dp[i-1][h],dp[i-1][h-p[i][j].w]+p[i][j].v);

                    }

                }

            }

        }

        int ans=-1;

        for(i=0;i<=m;i++)

        {

            if(dp[k][i]>ans) ans=dp[k][i];

        }

        if(ans>-1) printf("%d\n",ans);

        else printf("Impossible\n");

    }

    return 0;

}

 

你可能感兴趣的:(love)