Comet OJ - Contest #11 B 背包dp

Code: 

#include <bits/stdc++.h> 
#define N 1005   
#define M 2000
#define setIO(s) freopen(s".in","r",stdin)   
using namespace std;     
int A[N],B[N],w[M+3],f[M+3];        
int main() 
{ 
    // setIO("input");   
    int n,m,k,i,j,ans=0;    
    scanf("%d%d%d",&n,&m,&k);     
    for(i=0;i<=k;++i) scanf("%d",&w[i]);       
    for(i=1;i<=m;++i) scanf("%d%d",&A[i],&B[i]);      
    memset(f,-1,sizeof(f));          
    f[0]=0;      
    for(i=1;i<=n;++i) 
    {
        for(j=M;j>=0;--j) 
        {   
            if(f[j]==-1) continue;     
            for(int tmp=1;tmp<=m;++tmp) 
            {
                if(j>=A[tmp])             
                    f[j-A[tmp]]=max(f[j-A[tmp]], f[j]+B[tmp]);     
            }
        }  
        if(i!=n) 
        { 
            for(j=M;j>=0;--j) 
            { 
                if(f[j]==-1) continue;      
                f[j+w[j]]=max(f[j+w[j]], f[j]);   
            }  
        } 
    }
    for(j=0;j<=M;++j) 
    { 
        if(f[j]==-1) continue;        
        ans=max(ans, f[j]+w[j]+j);    
    }
    printf("%d\n",ans); 
    return 0; 
}

  

posted @ 2019-09-23 18:14  EM-LGH  阅读(119)  评论(0编辑  收藏  举报