1. 程式人生 > >[bzoj2748][HAOI2012]音量調節_動態規劃_背包dp

[bzoj2748][HAOI2012]音量調節_動態規劃_背包dp

sound $1 IV sans 代碼 ace 更新 () highlight

音量調節 bzoj-2748 HAOI-2012

題目大意:有一個初值,給你n個$\delta$值,求最後不超過給定的限制的情況下的改變的最大值。每個$\delta$值可以+也可以-。

註釋:$1\le n\le 50$,$1\le 限制\le 1000$。

想法:正負背包。在背包的之後更新用兩行更新,保證每一個$\delta$值都被計入了答案。

最後,附上醜陋的代碼... ...

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int c[1001];
bool v[51][1001];
int main()
{
    int n,beginsound,maxsound;
    scanf("%d%d%d",&n,&beginsound,&maxsound);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&c[i]);
    }
    v[0][beginsound]=1;
    for(int i=1;i<=n;i++)
        for(int j=0;j<=maxsound;j++)
        {
            if(j+c[i]<=maxsound)
            {
                if(v[i-1][j+c[i]])
                    v[i][j]=1;
            }
            if(j-c[i]>=0) 
            {
                if(v[i-1][j-c[i]])
                    v[i][j]=1;
            }
        }
    for(int i=maxsound;i>=0;i--)
    {
        if(v[n][i])
        {
            printf("%d",i);
            return 0;
        }
    }
    printf("-1");
    return 0;
}

小結:我們通常解題不過是將未知轉化成已知,或者探索未知而已。而這道題包括大部分的題都是前者。

[bzoj2748][HAOI2012]音量調節_動態規劃_背包dp