这个题目就是说,现在这个小孩去买鞋,然后一共有n种不同的原则,b种品牌,当然每个品牌都有一个价格(当心价格可能是0),小孩还给每个鞋子一个价值。现在小孩拿着m元钱去买鞋,要求每种品牌的鞋子都至少要买一双,问他能获得的最大价值是多少。这个题目是分组背包,但是注意和背包九讲的区别,背包九讲里的那个是每种鞋子最多购买一种。注意循环的时候的顺序。注释的语句很容易的帮你查找对错。
#include<iostream>
#include<cstring>
using namespace std;
int dp[11][10005];
int num[11];
int cost[11][100];
int value[11][100];
int maxi(int a,int b)
{
if(a>b)
return a;
return b;
}
int main()
{
int n,m,i,j,k,b,x,a,c,ans;
while(cin>>n>>m>>b)
{
for(i=1;i<=b;i++)
num[i]=0;
ans=0;
for(i=1;i<=n;i++)
{
cin>>x>>a>>c;
num[x]=num[x]+1;
cost[x][num[x]]=a;
value[x][num[x]]=c;
}
for(i=1;i<=b;i++)
for(j=0;j<=m;j++)
dp[i][j]=-1;
for(i=0;i<=m;i++)
dp[0][0]=0;
for(i=1;i<=b;i++)
{
for(j=1;j<=num[i];j++)
for(k=m;k>=cost[i][j];k--)
{
if(dp[i][k-cost[i][j]]!=-1)
dp[i][k]=maxi(dp[i][k],dp[i][k-cost[i][j]]+value[i][j]);
if(dp[i-1][k-cost[i][j]]!=-1)
dp[i][k]=maxi(dp[i][k],dp[i-1][k-cost[i][j]]+value[i][j]);
}
/*cout<<dp[i][m]<<endl;*/
}
if(dp[b][m]==-1)
cout<<"Impossible"<<endl;
else cout<<dp[b][m]+ans<<endl;
}
return 0;
}