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