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

【链接】
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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值