状态转移方程
dp[i][j]=max(dp[i-1][j-s[i][k].p]+s[i][k].v,dp[i][j-s[i][k].p]+s[i][k].v,dp[i][j]);
表示第i组j块钱的状态转移,要么从第i-1组放第当前这个物品,要么从i组放当前物品,dp的初始值为-1,dp[0][0]=0.当dp[i][j]=-1表示不存在这个状态
1 #include <string.h> 2 #include<stdio.h> 3 #define MAX 11000 4 5 struct 6 { 7 int p,v; 8 }s[11][MAX]; 9 int dp[11][MAX],num[11]; 10 11 int max(int a,int b){ 12 13 return a > b ? a : b; 14 } 15 16 int main() 17 { 18 int k,n,m; 19 while (~scanf("%d%d%d",&n,&m,&k)){ 20 memset(num,0,sizeof(num)); 21 memset(dp,-1,sizeof(dp)); 22 for (int i = 1; i <= n; ++i) 23 { 24 int a,b,c; 25 scanf("%d%d%d",&a,&b,&c); 26 num[a]++; 27 s[a][num[a]].p = b; 28 s[a][num[a]].v = c; 29 } 30 31 32 dp[0][0] = 0; 33 int flag=1; 34 for (int i = 1; i <= k; ++i) 35 { 36 if (!num[i]) {flag=0;break;} 37 38 for (int j = 1; j <= num[i]; ++j) 39 { 40 for (int q = m; q >= s[i][j].p; --q) 41 { 42 if (dp[i][q-s[i][j].p] != -1) 43 dp[i][q] = max(dp[i][q],dp[i][q-s[i][j].p] + s[i][j].v); 44 if (dp[i-1][q-s[i][j].p] != -1) 45 dp[i][q] = max(dp[i][q],dp[i-1][q-s[i][j].p] + s[i][j].v); 46 } 47 } 48 } 49 50 int ans=-1; 51 for (int i = m; i >= 0; --i) 52 if (ans < dp[k][i]) ans = dp[k][i]; 53 if (flag == 1 && ans != -1) 54 printf("%d\n",ans); 55 else 56 printf("Impossible\n"); 57 } 58 }