怎么说呢,思路一开始就有,就是分成几个块然后加,但水平太弱,很难实现QAQ
选择记录相加的最大上限来限制,其实挺好编的,有个条件是输出方案并且判断会不会有重复,这个。。。
终归有了思路,记录最大值(可以通过上限来求),并判断有没有重复
判重的地方又有了问题,如果在回溯过程中,ans可能会在任何区间改变,关键一步,把判重的东西改成数组。。。就行了
code
#include<iostream>
#include<cstring>
using namespace std;
int b[7],a[7][7];
int sum(int l,int r)
{ int ans=0;
for (int i=1;i<=r;++i)
ans+=a[i][i];
return ans;
}
int pd=0;
int ss;
int p[7];
int ls[7];int c[7];
int ans1[7];
int bf;
int ans[7];
int fcxpd[7];
int dfs(int x,int l,int r,int ppap,int t)
{
int anss=0;
if (x==0)
{ int tmp=a[l][r];
if (tmp>ppap)
return -1;
else
return tmp;
}
for (int i=l;i<=r-x;++i)
{ int xx=a[l][i];
int yy=dfs(x-1,i+1,r,ppap-xx,t+1);
if (yy!=-1)
{ if (ans[t]<ss-(ppap-xx-yy))
{ ans[t]=ss-(ppap-xx-yy);
p[t]=1;
ls[t]=xx;
if (t==bf)
ls[t+1]=yy;
fcxpd[t]=0;
}
else
if (ans[t]==ss-(ppap-xx-yy))
fcxpd[t]=1;
anss=max(anss,xx+yy);
}
}
if (anss!=0)
return anss;
else
return -1;
}
int fz(int i)
{ for (int j=1;j<=i+1;++j)
ans1[j]=ls[j];
}
int main()
{ int x,y;
cin>>x>>y;
do{
int yy=y;
int l=0;
while (yy>0)
{ ++l;
b[l]=yy%10;
yy/=10;
}
for (int i=1;i<=l;++i)
c[l-i+1]=b[i];
for (int i=1;i<=l;++i)
for (int j=i;j<=l;++j)
a[i][j]=a[i][j-1]*10+c[j];
ss=x;
int pdcf=0;int zdfs;int mm=0;
if (x<y)
{ for (int i=l-1;i>=1;--i)
{ bf=i;
memset(fcxpd,0,sizeof(fcxpd));
memset(ans,0,sizeof(ans));
int m=dfs(i,1,l,x,1);
if (m!=-1)
{ if (m>mm)
{ fz(i);
mm=m;
int fcxpdx=0;
for (int k=1;k<=4;++k)
if (fcxpd[k])
fcxpdx=1;
if (fcxpdx==0)
pdcf=0;
else
pdcf=1;
zdfs=i;
}
else
if (m==mm)
pdcf=1;
}
}
if (mm)
{ if (pdcf)
cout<<"rejected"<<endl;
else
{ cout<<mm<<" ";
for (int i=1;i<=zdfs;++i)
cout<<ans1[i]<<" ";
cout<<ans1[zdfs+1];
cout<<endl;
}
}
else
cout<<"error"<<endl;
}
else
{ cout<<y<<" "<<y<<endl;
}
cin>>x>>y;
}while (x!=0);
}