刪數問題(貪心法經典問題)


 

問題描述:用鍵盤輸入一個高精度的正整數N,去掉其中S個數字后剩下的數字按原左右次序排列組成一個新的正整數。

     編程給定的N和S,尋找一個方案使得剩下的數字哦組成的新數最小。

 

思路解析: 使用逼近目標的貪心法來逐一逼近刪除其中s個數符,每一步總數選擇一個是剩下的數最小的數符刪除。這樣的貪心選擇因為刪除S個數符的全優解包含了刪除一個

     數符的子問題的最優解。按從左到右尋找遞減區間,刪除第一個數字。若找不到遞減區間 則刪除末尾的數字。

 

 1 void find_Min_Integer(vector<int> &nums,int S)
 2 {
 3     vector<int> result;
 4 
 5      if(S>nums.size())
 6      {
 7         nums.clear();
 8         return;
 9      }
10      //從左到右尋找遞歸序列
11 
12      while(S>0)
13      {
14         int i;
15         for(i=0;(i<nums.size())&&(nums[i]<=nums[i+1]);i++)
16             ;
17         nums.erase(i);  //刪除該區間的首字符  包括找不到遞減區間時 刪除末尾
18         S--;
19      }
20 
21      while(nums.size()>1&&nums[0]==0)  //刪除頭部的無效數字0
22         nums.erase(0);
23 }

 

貪心選擇性質:可通過局部最優選擇來達到全局最優解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM