给出n个数。。。初始值为零 对每一个数赋一个正或负号。使得,每次操作的值在【0,k】之间
输出最长的符号长度 及其符号
对每一个数 判断其正负数+前一个数(遍历)是否合法,如果合法且正 a[i]+x 标记为1,负标记为-1;
最后找到最后一个数,往前一直推即可得答案
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
int a[1005][1005];
int c[1005];
char ans[1005];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
int i,j;
int tmp;
for (i=1;i<=n;i++)
{
scanf("%d",&tmp);
c[i]=tmp;
}
a[1][c[1]]=1;
for (i=2;i<=n;i++)
{
int cnt=0;
for (j=0;j<=1000;j++)
{
if (a[i-1][j])
{
if (j+c[i]<=k)
{
a[i][j+c[i]]=1;
cnt=1;
}
if (j-c[i]>=0)
{
a[i][j-c[i]]=-1;
cnt=1;
}
}
}
if (cnt==0)break;
}
int mark=i-1; //最长长度
i--;
printf("%d\n",mark);
for (j=0;j<=1000;j++)
{
if (a[mark][j]==1)
{
ans[mark]='+';
break;
}
else
if (a[mark][j]==-1)
{
ans[mark]='-';
break;
}
}
i=j;
if (ans[mark]=='+')
i-=c[mark];
else
i+=c[mark];
for (j=mark-1;j>=1;j--)
{
if (a[j][i]==1)
ans[j]='+';
else
ans[j]='-';
if (a[j][i]==1)
i-=c[j];
else
if (a[j][i]==-1)
i+=c[j];
}
for (i=1;i<=mark;i++)
{
printf("%c",ans[i]);
}
cout<<endl;
return 0;
}