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

来源:互联网 发布:苹果备份软件itunes 编辑:程序博客网 时间:2024/06/06 09:09

hdu 3033 I love sneakers!

分析

题目大意:就是首先告诉你物品的总数N,最大的钱数M,以及组的个数K,接着N行,告诉你三个数,他是哪组的g,价格b,价值,c。约束是每组都必须选一个,一组内可以选多个。
有了http://blog.csdn.net/pibaixinghei/article/details/50383649做铺垫,这个也就是里面的一个小种类,不多说了。

问题

http://acm.hdu.edu.cn/showproblem.php?pid=3033

代码

#include <iostream>#include <cstring>#include <ctime>#include <fstream>#include <cstdlib>#include <algorithm>#include <set>#include <vector>using namespace std;int N,M,K,gg;int b[110],c[110],group[15][110],num[15];int dp[15][10010];int main(){    while(scanf("%d %d %d",&N,&M,&K)!=EOF)    {        memset(dp,-1,sizeof(dp));        memset(num,0,sizeof(num));        memset(dp[0],0,sizeof(dp[0]));        for(int i=1; i<=N; i++)        {            scanf("%d %d %d",&gg,&b[i],&c[i]);            group[gg][num[gg]++]=i;        }        for(int i=1; i<=K; i++)        {            for(int j=0; j<num[i]; j++)            {                for(int k=M; k>=b[group[i][j]]; k--)                {                    if(dp[i][k-b[group[i][j]]]!=-1)                        dp[i][k]=max(dp[i][k],dp[i][k-b[group[i][j]]]+c[group[i][j]]);                    if(dp[i-1][k-b[group[i][j]]]!=-1)                        dp[i][k]=max(dp[i][k],dp[i-1][k-b[group[i][j]]]+c[group[i][j]]);                }            }        }        if(dp[K][M]==-1)            cout<<"Impossible"<<endl;        else            cout<<dp[K][M]<<endl;    }    return 0;}
0 0
原创粉丝点击