BZOJ 2748 DP

思路:
DP啊
f[i][j]表示第i场能否到达j音量

  if(j>=xx)f[i][j]=max(f[i-1][j-xx],f[i][j]);
  if(j+xx<=ml)f[i][j]=max(f[i-1][j+xx],f[i][j]);

搞定

//By SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
int n,bl,ml,xx;
int f[55][1005];
int main(){
    scanf("%d%d%d",&n,&bl,&ml);
    f[0][bl]=1;
    for(int i=1;i<=n;i++){
        scanf("%d",&xx);
        for(int j=0;j<=ml;j++){
            if(j>=xx)f[i][j]=max(f[i-1][j-xx],f[i][j]);
            if(j+xx<=ml)f[i][j]=max(f[i-1][j+xx],f[i][j]);
        }
    }
    for(int i=ml;i>=0;i--){
        if(f[n][i]){printf("%d\n",i);return 0;}
        if(!i)puts("-1");
    }
}

这里写图片描述

posted @ 2016-10-14 00:27  SiriusRen  阅读(70)  评论(0编辑  收藏  举报