題目大意:給定一個目標數和一個寫在紙上將被粉碎的數,被粉碎的意思是將整數進行分割(如12346
1+2+34+6),求分割後的數加起來小於目標數且最接近目標數,如果分割的方式不止一種,輸出rejected;如果目標數和指定的數相同,直接輸出;如果目標數小於分割的最小數,輸出error;否則,輸出最接近目標數的數,並輸出分割方式。
題目分析: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;
while(cin>>target>>shredded)
{
if(target==0
&& shredded[0]=='0')
break;
len=strlen(shredded);
//輸入字符串的長度
for(i=1;i<=len;i++)
//將輸入的字符轉換成爲整形存儲在visit[]數組中
visit[i]=shredded[i-1]-'0';
IntShredded=addString(shredded);
//將輸入的數據轉成爲一個整數
m=0;
//將每位數都相加得出和的最小值
for(i=1;i<=len;i++)
m+=visit[i];
if(IntShredded==target)
{
cout<<target<<"
"<<target<<endl;
continue;
}
if(m>target)
//目標數小於和的最小值
{
cout<<"error"<<endl;
continue;
}
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)
{
cout<<result<<"
";
for(k=1;k<finalPLen;k++)
//將路徑進行輸出,finalPath[0]肯定是0
{
if(finalPath[k]=='+'
&& k>1)
//k>1
如("0+1+2+3+4+5+6")
cout<<" ";
if(finalPath[k]!='+')
cout<<finalPath[k];
}
cout<<endl;
}
else
cout<<"rejected"<<endl;
}
return 0;
}
void DFS(int depth,int sum)
{
int pathLen=strlen(path);
if(sum>target) return;
if(depth>len)
{
if(target-sum<ans)
{
cout<<path<<endl;
strcpy(finalPath,path);
//將路徑保存
num=0;
result=sum;
ans=target-sum;
cout<<"***"<<ans<<endl;
return ;
}
if(target-sum==ans)
num++;
return ;
}
path[pathLen]='+';
path[pathLen+1]=shredded[depth-1];
path[pathLen+2]='\0';
int m=addString(path);
DFS(depth+1,m);
path[pathLen]=shredded[depth-1];
path[pathLen+1]='\0';
m=addString(path);
DFS(depth+1,m);
}
int addString(char *s)
//對一個字符串進行求和
{
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;
}
else
{
j=s[i]-'0';
temp=10*temp+j;
}
}
return sum+temp;
}