题目大意:给定一个目标数和一个写在纸上将被粉碎的数,被粉碎的意思是将整数进行分割(如12346 1+2+34+6),求分割后的数加起来小于目标数且最接近目标数,如果分割的方式不止一种,输出rejected;如果目标数和指定的数相同,直接输出;如果目标数小于分割的最小数,输出error;否则,输出最接近目标数的数,并输出分割方式。
while(cin>>target>>shredded)
if(target==0 && shredded[0]=='0')
len=strlen(shredded);
//输入字符串的长度
IntShredded=addString(shredded);
//将输入的数据转成为一个整数
m=0;
//将每位数都相加得出和的最小值
m+=visit[i];
if(IntShredded==target)
if(m>target)
//目标数小于和的最小值
ans=99999;
//初始化操作
finalPath[0]='\0';
num=0;
path[0]='0';
//path第一个数添加为0,那么以后每个前面输出的时候要除去这个0
path[1]='\0';
DFS(1,0);
int k;
int finalPLen=strlen(finalPath);
if(num==1)
{
if(finalPath[k]=='+' && k>1)
//k>1 如("0+1+2+3+4+5+6")
}
else
return 0;
if(depth>len)
if(target-sum<ans)
{
cout<<path<<endl;
strcpy(finalPath,path);
//将路径保存
num=0;
result=sum;
ans=target-sum;
cout<<"***"<<ans<<endl;
}
if(target-sum==ans)
num++;
return ;
DFS(depth+1,m);
path[pathLen]=shredded[depth-1];
int n,temp=0;
int i,j;
int sum=0;
n=strlen(s);
for(i=0;i<n;i++)
{
if(s[i]=='+')
sum=sum+temp;
temp=0;
temp=10*temp+j;
}
return sum+temp;
题目分析:DFS找出最优解
在写个函数用来计算字符数组的值。
题目实现:
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int target;
//目标数
int len;
//搜索的深度
int visit[20];
//存放输入整数的各个位数
int ans;
//存放差值
int result;
//存放结果
int num;
//用来计数可能出现的相同结果的次数
char path[100];
char finalPath[100];
int IntShredded;
//被分割数的整数形式
char shredded[20];
//被分割的字符串
void DFS(int depth,int sum);
int addString(char *s);
int main ()
{
int i,m;
int n;
{
break;
for(i=1;i<=len;i++)
//将输入的字符转换成为整形存储在visit[]数组中
visit[i]=shredded[i-1]-'0';
for(i=1;i<=len;i++)
{
cout<<target<<" "<<target<<endl;
continue;
}
{
cout<<"error"<<endl;
continue;
}
cout<<result<<" ";
for(k=1;k<finalPLen;k++)
//将路径进行输出,finalPath[0]肯定是0
{
cout<<" ";
if(finalPath[k]!='+')
cout<<finalPath[k];
}
cout<<endl;
cout<<"rejected"<<endl;
}
}
void DFS(int depth,int sum)
{
int pathLen=strlen(path);
if(sum>target) return;
{
return ;
}
path[pathLen]='+';
path[pathLen+1]=shredded[depth-1];
path[pathLen+2]='\0';
int m=addString(path);
path[pathLen+1]='\0';
m=addString(path);
DFS(depth+1,m);
}
int addString(char *s)
//对一个字符串进行求和
{
{
}
else
{
j=s[i]-'0';
}
}