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

来源:互联网 发布:php网上订餐系统 编辑:程序博客网 时间:2024/06/06 17:33

【链接】
bzoj2748

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

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

#include<cstdio>#include<cstring>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;}
原创粉丝点击