BZOJ2748(HAOI2012)[音量调节]--01背包

【链接】
bzoj2748

【题目大意】
给你n,初始数的大小和所能达到最大数的大小,在给你n个数让你每次加上这个数或减去这个数,但不能超过限定大小,使最后得到的结果最大。

【解题报告】
此题其实一眼看就知道是01背包了,只需要中间特判一下输-1就好了。

#include
#include
using namespace std;
const int maxn=1005;
int n,ans,st,MAX,f[maxn],g[maxn];
inline int Read()
{
    int res=0;
    char ch=getchar();
    while (ch<'0'||ch>'9') ch=getchar();
    while (ch>='0'&&ch<='9') res=res*10+ch-48,ch=getchar();
    return res;
}
int main()
{
    freopen("2748.in","r",stdin);
    freopen("2748.out","w",stdout);
    n=Read(); st=Read(); MAX=Read();
    memset(g,0,sizeof(g)); g[st]=1;
    for (int i=1,x; i<=n; i++)
    {
        memset(f,0,sizeof(f));
        x=Read();
        for (int j=MAX; j>=0; j--)
         if (g[j])
          {
            if (j+x<=MAX) f[j+x]=1;
            if (j-x>=0) f[j-x]=1;
          }
        bool pd=0;
        for (int j=MAX; j>=0; j--) {g[j]=f[j]; if (f[j]) pd=1;}
        if (!pd) {printf("-1"); return 0;}
    }
    ans=MAX;
    while (!f[ans]) ans--;
    printf("%d",ans);
    return 0;
}

你可能感兴趣的:(BZOJ题解,背包,BZOJ题解,By,Greninja,部分常见刷题网站的题解,By,Greninja)