Advertisement
Guest User

SUMLUCKYNUM

a guest
Dec 17th, 2013
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. int dis[1000005];
  2. bool vis[1000005];
  3. class TheSumOfLuckyNumbers
  4. {
  5. public:
  6.     vector <int> sum(int n)
  7.     {
  8.       // 1. generate Lucky numbers in a vector
  9.         vector<long long>v;
  10.         vector<int>ans;
  11.         queue<long long>Q;
  12.         Q.push(4);
  13.         Q.push(7);
  14.         while(!Q.empty())
  15.         {
  16.             long long s=Q.front();
  17.             Q.pop();
  18.             if(s<=1000000)
  19.             {
  20.                 v.push_back(s);
  21.             }
  22.             long long num=s*10+4;
  23.             if(num<=1000000)
  24.             {
  25.                 Q.push(num);
  26.             }
  27.             num=s*10+7;
  28.             if(num<=1000000)
  29.             {
  30.                 Q.push(num);
  31.             }
  32.         }
  33.         int sz=v.size();
  34.         //cout<<sz<<endl;
  35.  
  36.         // 2. calculate distance
  37.         for(int i=0;i<=1000000;i++)dis[i]=0,vis[i]=false;
  38.         queue<int>q;
  39.         q.push(0);
  40.         dis[0]=0;
  41.         vis[0]=1;
  42.         while(!q.empty())
  43.         {
  44.             int u=q.front();
  45.             q.pop();
  46.             for(int i=0;i<sz;i++)
  47.             {
  48.                 int nu=u+v[i];
  49.                 if(nu>n)break;
  50.                 if(!vis[nu])
  51.                 {
  52.                     vis[nu]=1;
  53.                     dis[nu]=dis[u]+1;
  54.                     q.push(nu);
  55.                 }
  56.             }
  57.         }
  58.         //cout<<dis[n]<<endl;
  59.  
  60.        // 3. Print solution
  61.         if(!vis[n])return ans;
  62.         for(int i=0;i<sz;i++)
  63.         {
  64.             while(v[i]<=n)
  65.             {
  66.                 if(dis[n-v[i]]==dis[n]-1 && vis[n-v[i]] )
  67.                 {
  68.                     ans.push_back(v[i]);
  69.                     n-=v[i];
  70.                 }
  71.                 else break;
  72.             }
  73.         }
  74.       return ans;
  75.     }
  76. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement