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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值