PKU1416 DFS回溯。。。。

题意:给定两个数n,m。例如50 12346,问如何切割后面的那个数,使得所分成的数之和最靠近n;
#include<iostream>
#include<string.h>
using namespace std;
char str[100];
int a[100][100];
int sum,n,len;
int ans[100],t[100],ansn,res,cntn;
int s,k;
void dfs(int i)
{
   if(i>=len)
   {
      if(s<=sum&&s==res)
       {
              cntn=2;
              return;
       }
       if(s<=sum&&s>res)
       {
          cntn=1;
          ansn=k;
              res=s;
              for(int kk=0;kk<k;kk++)
              {
                     ans[kk]=t[kk];
                     // cout<<ans[kk]<<' ';
              }
       }
       return ;
   }
   if(s+a[i][i]<=sum)
   {
          for(int j=i;j<len;j++)
          {
                 s+=a[i][j];
                 t[k++]=a[i][j];
                 dfs(j+1);
                 s-=a[i][j];
                 k--;
          }
   }
}
int main()
{
    while(scanf("%d%s",&sum,str)==2)
       {
              if(sum==0&&str[0]=='0')
                     break;
              len=strlen(str);
              int i,j;
              int temp=0;
              for(i=0;i<len;i++)
              {
                     a[i][i]=str[i]-'0';
                     temp+=a[i][i];
                     for(j=i+1;j<len;j++)
                     {
                            a[i][j]=a[i][j-1]*10+str[j]-'0';
                     //     cout<<a[i][j]<<endl;
                     }
              }
              if(temp>sum)
              {
                     printf("error\n");
                     continue;
              }
              s=0;
              k=0;
              res=-1;
              dfs(0);
              if(cntn>1)
                     printf("rejected\n");
              else
              {
            printf("%d %d",res,ans[0]);
                     for(i=1;i<ansn;i++)
                            printf(" %d",ans[i]);
                     puts("");
              }
       }
       return 0;
}

你可能感兴趣的:(PKU1416 DFS回溯。。。。)