【链接】
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;
}