FATE

DP  用记忆化搜索写了一遍,细节问题未考虑清楚。

//此题参考网上代码 
#include <stdio.h>
#include <string.h>
#define N 110
int max(int x,int y) 
{
    return x>y?x:y;
}
int n,m,c,s;
int a[N],b[N];
int f[N][N];
bool input(){
       if(scanf("%d %d %d %d",&n,&m,&c,&s)!=4) 
       return 0;
       int i;
       for(i=1;i<=c;i++)
              scanf("%d %d",a+i,b+i);
       memset(f,0,sizeof(f));
       return 1;
}
void solve(){
       int i,j,k,M;
       for(i=1;i<=s;i++){
              for(j=1;j<=m;j++){
                     M=max(f[i-1][j],f[i][j-1]);
                     for(k=1;k<=c;k++){
                            if(j>=b[k]) M=max(M,f[i-1][j-b[k]]+a[k]);
                     }
                     f[i][j]=M;
              }
       }
}
void dis(){
       int i,j;
       if(f[s][m]<n)
              printf("-1\n");
       else{
              for(i=m;;i--){
                     if(f[s][i]<n)
                            break;
              }
              printf("%d\n",m-(i+1));
       }
}
int main(){
      while(input()){
              solve();
              dis();
       }
       return 0;

}


 

你可能感兴趣的:(FATE)