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