[bzoj2748][haoi2012]音量调节

一个放在普及组都不为过的超级大水题。
一眼就看出来是线性dp, 定义f[i][j]为第i首歌是否可以以音量为j唱。
方程比较简单,略。
dp用刷表法比较方便。
代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
bool f[55][maxn];
int n, be, ma;
int c[55];
void dp() {
    memset(f, 0, sizeof(f));
    f[0][be] = true;
    for(int i = 0; i < n; i++) {
        for(int j = 0; j <= ma; j++) {
            if(f[i][j]) {
                if(j+c[i+1] <= ma) f[i+1][j+c[i+1]] = true;
                if(j-c[i+1] >= 0) f[i+1][j-c[i+1]] = true;
            }
        }
    }
}
int main() {
    scanf("%d %d %d", &n, &be, &ma);
    for(int i = 1; i <= n; i++) {
        scanf("%d", &c[i]);
    }
    dp();
    for(int i = ma; i >= 0; i--) {
        if(f[n][i]) {
            printf("%d", i);
            return 0;
        }
    }
    printf("%d", -1);
}

posted on 2017-01-20 16:45  蒟蒻konjac  阅读(145)  评论(0编辑  收藏  举报