poj1416

題目大意:給定一個目標數和一個寫在紙上將被粉碎的數,被粉碎的意思是將整數進行分割(如12346 1+2+34+6),求分割後的數加起來小於目標數且最接近目標數,如果分割的方式不止一種,輸出rejected;如果目標數和指定的數相同,直接輸出;如果目標數小於分割的最小數,輸出error;否則,輸出最接近目標數的數,並輸出分割方式。
題目分析:DFS找出最優解
poj1416
每位數一個一個的加入,用一個字符數組存放,向字符數據加入的方式分別是"+X"和"X"(X爲第幾個數)
在寫個函數用來計算字符數組的值。

題目實現:
#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;
}











發佈了26 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章