[BZOJ2748/Luogu1877][HAOI2012]音量调节(动态规划)

发布于 2018-02-02  52 次阅读


本文章由SYCstudio或本站其它作者所有,严禁转载,转载必究

本文链接地址:[BZOJ2748/Luogu1877][HAOI2012]音量调节(动态规划)

Description

一个吉他手准备参加一场演出。他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量。在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改变的音量是多少。每一次改变音量,他可以选择调高也可以调低。
音量用一个整数描述。输入文件中给定整数beginLevel,代表吉他刚开始的音量,以及整数maxLevel,代表吉他的最大音量。音量不能小于0也不能大于maxLevel。输入文件中还给定了n个整数c1,c2,c3…..cn,表示在第i首歌开始之前吉他手想要改变的音量是多少。
吉他手想以最大的音量演奏最后一首歌,你的任务是找到这个最大音量是多少。

Http

BZOJ
Luogu

Tag

动态规划

解决思路

与其说是动态规划不如说是打标记?

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;

#define ll long long
#define mem(Arr,x) memset(Arr,x,sizeof(Arr))

const int maxN=51;
const int maxL=1010;
const int inf=2147483647;

int n,st,mx;
int C[maxN];
bool F[maxN][maxL];

int main()
{
    scanf("%d%d%d",&n,&st,&mx);
    for (int i=1;i<=n;i++) scanf("%d",&C[i]);
    F[0][st]=1;
    for (int i=1;i<=n;i++)
        for (int j=0;j<=mx;j++)
        {
            if (j-C[i]>=0) F[i][j]=F[i][j]|F[i-1][j-C[i]];
            if (j+C[i]<=mx) F[i][j]=F[i][j]|F[i-1][j+C[i]];
        }
    int pos=-1;
    for (int i=mx;i>=0;i--) if (F[n][i]) {pos=i;break;}
    printf("%d\n",pos);
    return 0;
}

本文章由SYCstudio或本站其它作者所有,严禁转载,转载必究

本文链接地址:[BZOJ2748/Luogu1877][HAOI2012]音量调节(动态规划)


HNCJ OIer 一枚