找啊找啊找GF~背包拓展

出处:RQNOJ 57

 

开始时没有考虑MM最大值,果断Wrong,后面一分析,发现状态转移方程不对,立马改了过来,增加了一个计算数量的数组,最后输出再加个判断就AC了。网上有些优化的代码看不懂就没去理了,有兴趣的可以去研究一下。

 

#include
#include
#define min(a,b) ab?(a):(b)
using namespace std;

const int INF=0x3ffffff;
const int N=101;

int main()
{
    int m,r,n,i,j,k,maxn,mint;
    int rmb[N],rp[N],time[N],dp[N][N],c[N][N];
    while (~scanf("%d",&n))
    {
           for (i=1;i<=n;i++) 
               scanf("%d %d %d",rmb+i,rp+i,time+i);
           scanf("%d %d",&m,&r);
           for (i=0;i<=m;i++) for (j=0;j<=r;j++) c[i][j]=0;
           for (i=1;i<=m;i++) for (j=1;j<=r;j++) dp[i][j]=INF;  
           for (i=0;i<=m;i++) dp[i][0]=0; 
           for (j=0;j<=r;j++) dp[0][j]=0; 
           for (i=1;i<=n;i++)
           {
               for (j=m;j>=rmb[i];j--)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
               {
                   for (k=r;k>=rp[i];k--)
                   {
                       if (c[j][k]<=c[j-rmb[i]][k-rp[i]])
                       {
                          c[j][k]=c[j-rmb[i]][k-rp[i]]+1;
                          dp[j][k]=dp[j-rmb[i]][k-rp[i]]+time[i];                                
                       }
                       else if (c[j][k]==c[j-rmb[i]][k-rp[i]]+1)
                       {
                            dp[j][k]=min(dp[j][k],dp[j-rmb[i]][k-rp[i]]+time[i]);     
                       }   
                   }    
               }    
           } 
           for (i=maxn=0,mint=INF;i<=m;i++) 
           {
               for (j=0;j<=r;j++) 
               {
                   if (c[i][j]>maxn) maxn=c[i][j],mint=dp[i][j];
                   else if (c[i][j]==maxn) mint=min(mint,dp[i][j]);
               }
           }
           if (mint==INF) printf("0\n");
           printf("%d\n",mint);
    }
    return 0;   
} 


 

你可能感兴趣的:(动态规划)