题目大意:
有k种鞋子,每种鞋子还有很多款式,每一款鞋子都有它的价格和价值;
在一定金额限制下,每一种鞋子至少买一双,最大可以获得多大的价值;
解题思路:
这道题目也是分组背包的一种类型,要求每一组中必拿一种;
dp【i】【j】表示前k种物品花费j的情况下获得的最大价值;
每进行一次操作的时候有2种情况:
1:当前的种类已经拿过,则优先考虑从本层拿取最大值;
2:物品种数少于当前层则要用上一层的加上当前层的取最大值;
因为考虑到有价格为0的物品,所以要初始化为-1,但为了第一层的递推,还要将dp【0】这一层设置为0,
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int n,m,k;
while(~scanf("%d%d%d",&n,&m,&k))
{
int dp[11][10010];
memset(dp,-1,sizeof(dp));
memset(dp[0],0,sizeof(dp[0]));
vector<pair<int,int> > q[15];
for(int i=0;i<15;i++)
q[i].clear();
for(int i=0;i<n;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
pair<int,int> node;
node.first=b;
node.second=c;
q[a].push_back(node);
}
for(int i=1;i<=k;i++)
{
for(int j=0;j<q[i].size();j++)
{
for(int t=m;t>=q[i][j].first;t--)
{
if(dp[i][t-q[i][j].first]!=-1)
dp[i][t]=max(dp[i][t],dp[i][t-q[i][j].first]+q[i][j].second);
if(dp[i-1][t-q[i][j].first]!=-1)
dp[i][t]=max(dp[i][t],dp[i-1][t-q[i][j].first]+q[i][j].second);
}
}
}
if(dp[k][m]!=-1)
printf("%d\n",dp[k][m]);
else
printf("Impossible\n");
}
}