<问题分析>
状态转移方程 s[i][j]=s[i-rmb[k]][j-rp[k]]+1 if(s[i][j]<s[i-rmb[k]][j-rp[k]]+1)
1 #include <stdio.h> 2 #include <string.h> 3 4 5 #define N 100+1 6 7 int main() 8 { 9 int n,i,j,k,m,r,rmb[N],rp[N],time[N],s[N][N],c[N][N]; 10 scanf("%d",&n); 11 for(i=1;i<=n;i++) 12 { 13 scanf("%d %d %d",&rmb[i],&rp[i],&time[i]); 14 } 15 scanf("%d %d",&m,&r); 16 memset(s,0,N*N*sizeof(int)); 17 memset(c,0,N*N*sizeof(int)); 18 for(i=1;i<=n;i++) 19 { 20 for(j=m;j>=rmb[i];j--) 21 { 22 for(k=r;k>=rp[i];k--) 23 { 24 25 if(s[j][k]<s[j-rmb[i]][k-rp[i]]+1) 26 { 27 s[j][k]=s[j-rmb[i]][k-rp[i]]+1; 28 c[j][k]=c[j-rmb[i]][k-rp[i]]+time[i]; 29 } 30 else if(s[j][k]==s[j-rmb[i]][k-rp[i]]+1&&c[j-rmb[i]][k-rp[i]]+time[i]<c[j][k]) 31 { 32 c[j][k]=c[j-rmb[i]][k-rp[i]]+time[i]; 33 } 34 } 35 } 36 } 37 i=c[m][r]; 38 printf("m:%d r:%d %d ",m,r,i); 39 for(j=m;j>=0;j--) 40 { 41 for(k=r;k>=0;k--) 42 { 43 if(s[j][k]!=s[m][r]) 44 { 45 continue; 46 } 47 if(i>c[j][k]) 48 i=c[j][k]; 49 } 50 } 51 printf("%d ",i); 52 while(true); 53 return 0; 54 }