MM群2007七夕模拟赛

  

 

<问题分析>

状态转移方程 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\n",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\n",i);
52     while(true);
53     return 0;
54 }

 

posted @ 2013-07-04 15:00  simplesslife  阅读(209)  评论(0编辑  收藏  举报