POJ 1775 Sum of Factorials

题目大意:给出n,判断其是不是可以这样表示的数:9=1!+2!+3!

思路:我的做法dfs无限tie了,,看了别人的解题报告,才写出来的。

方法一:贪心,从最大的数(9!)开始减,遇到能减的都减!最后n如果为0,则可以!原理是:a!+b!+c!+d!(a<b<c<d),对于n来说,当它大于d的话,就绝对要减去d!为什么?因为

d!>a!+b!+c!,如果n不减去d!的话,那么剩下的阶乘的和绝对不能把n搞死!  但是,当n减去d!又小于c!的时候怎么办呢?同理可得,向前面找,找到比n小的就又减!

方法二:带有DP味道的DFS。

 

program(一):

 

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<time.h>
using namespace std;
int n;
int c[15]={1,1,2,6,24,120,720,5040,40320,362880 };
int main()

while(scanf("%d",&n)!=EOF&&(n>=0))
{  
     if(n==0  ||  n>409114  || (n>46234&&n<362880) || (n>5914&&n<40320) || (n>874&&n<5040) || (n>154&&n<720) || (n>34&&n<120) || (n>10&&n<24))
        {
          printf("NO\n");
          continue;    
        }
     int p=9;
     while(n>0&&p>=0)
     {
       if(n>=c[p])
        {
         n-=c[p];        
        }       
        p--; 
     }
     if(n==0)
       printf("YES\n");
     else
       printf("NO\n");
            
                        
               
}
//system("pause");
return 0;}

program(二):转载来自:http://blog.csdn.net/xinghongduo/article/details/6039470

 

#include<iostream>
using namespace std;
int flag,J[10],n;
void find(int a,int sum)
{
 if(a>9)
  return;
 if(n<sum)
  return ;
 if(n==sum)
 {
  flag=1;
  return;
 }
 find(a+1,sum+J[a+1]);
 find(a+1,sum);
}

int main()
{
 int i;
 for(i=1,J[0]=1;i<10;i++)
  J[i]=J[i-1]*i;
 while(cin>>n&&n>-1)
 {
  if(n==0)
   cout<<"NO"<<endl;
  else
  {
   flag=0;
   find(-1,0);
   if(flag)
    cout<<"YES"<<endl;
   else
    cout<<"NO"<<endl;
  }
 }
 
 return 0;
}

 

program:还有媛媛姐的打表:  http://blog.csdn.net/zxy_snow/article/details/6164842

 

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
int fact[11] = {0,1,1,2,6,24,120,720,5040,40320,362880};
int num[20000];
int cou;
int used[11];
int sum,flag,yumen;
void DFS(int x)
{
 int i;
 if( sum != 0 && yumen == flag )
 {
  num[cou++] = sum;
 }
 for(i=x; i<=10; i++)
  if( !used[i] )
  {
   flag ++;
   used[i] = 1;
   sum += fact[i];
   DFS(i);
   flag--;
   used[i] = 0;
   sum -= fact[i];
  }
}
void init()
{
 memset(used,0,sizeof(used));
 sum = 0;
 cou = 1;
}
int main()
{
 freopen("out.txt","w",stdout);
 int n,i;
 init();
 for(i=1; i<=10; i++)
 {
  memset(used,0,sizeof(used));
  sum = 0;
  flag = 0; yumen = i;
  DFS(1);
 }
 for(i=1; i<cou; i++)
  cout << num[i] << ',';
return 0;
}

 

 

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
int num[1024] = {1,1,2,6,24,120,720,5040,40320,362880,2,3,7,25,121,721,5041,40321,362881,3,7,25,121,721,5041,40321,362881,8,26,122,722,5042,40322,362882,30,126,726,5046,40326,362886,144,744,5064,40344,362904,840,5160,40440,363000,5760,41040,363600,45360,367920,403200,4,8,26,122,722,5042,40322,362882,9,27,123,723,5043,40323,362883,31,127,727,5047,40327,362887,145,745,5065,40345,362905,841,5161,40441,363001,5761,41041,363601,45361,367921,403201,9,27,123,723,5043,40323,362883,31,127,727,5047,40327,362887,145,745,5065,40345,362905,841,5161,40441,363001,5761,41041,363601,45361,367921,403201,32,128,728,5048,40328,362888,146,746,5066,40346,362906,842,5162,40442,363002,5762,41042,363602,45362,367922,403202,150,750,5070,40350,362910,846,5166,40446,363006,5766,41046,363606,45366,367926,403206,864,5184,40464,363024,5784,41064,363624,45384,367944,403224,5880,41160,363720,45480,368040,403320,46080,368640,403920,408240,10,28,124,724,5044,40324,362884,32,128,728,5048,40328,362888,146,746,5066,40346,362906,842,5162,40442,363002,5762,41042,363602,45362,367922,403202,33,129,729,5049,40329,362889,147,747,5067,40347,362907,843,5163,40443,363003,5763,41043,363603,45363,367923,403203,151,751,5071,40351,362911,847,5167,40447,363007,5767,41047,363607,45367,367927,403207,865,5185,40465,363025,5785,41065,363625,45385,367945,403225,5881,41161,363721,45481,368041,403321,46081,368641,403921,408241,33,129,729,5049,40329,362889,147,747,5067,40347,362907,843,5163,40443,363003,5763,41043,363603,45363,367923,403203,151,751,5071,40351,362911,847,5167,40447,363007,5767,41047,363607,45367,367927,403207,865,5185,40465,363025,5785,41065,363625,45385,367945,403225,5881,41161,363721,45481,368041,403321,46081,368641,403921,408241,152,752,5072,40352,362912,848,5168,40448,363008,5768,41048,363608,45368,367928,403208,866,5186,40466,363026,5786,41066,363626,45386,367946,403226,5882,41162,363722,45482,368042,403322,46082,368642,403922,408242,870,5190,40470,363030,5790,41070,363630,45390,367950,403230,5886,41166,363726,45486,368046,403326,46086,368646,403926,408246,5904,41184,363744,45504,368064,403344,46104,368664,403944,408264,46200,368760,404040,408360,408960,34,130,730,5050,40330,362890,148,748,5068,40348,362908,844,5164,40444,363004,5764,41044,363604,45364,367924,403204,152,752,5072,40352,362912,848,5168,40448,363008,5768,41048,363608,45368,367928,403208,866,5186,40466,363026,5786,41066,363626,45386,367946,403226,5882,41162,363722,45482,368042,403322,46082,368642,403922,408242,153,753,5073,40353,362913,849,5169,40449,363009,5769,41049,363609,45369,367929,403209,867,5187,40467,363027,5787,41067,363627,45387,367947,403227,5883,41163,363723,45483,368043,403323,46083,368643,403923,408243,871,5191,40471,363031,5791,41071,363631,45391,367951,403231,5887,41167,363727,45487,368047,403327,46087,368647,403927,408247,5905,41185,363745,45505,368065,403345,46105,368665,403945,408265,46201,368761,404041,408361,408961,153,753,5073,40353,362913,849,5169,40449,363009,5769,41049,363609,45369,367929,403209,867,5187,40467,363027,5787,41067,363627,45387,367947,403227,5883,41163,363723,45483,368043,403323,46083,368643,403923,408243,871,5191,40471,363031,5791,41071,363631,45391,367951,403231,5887,41167,363727,45487,368047,403327,46087,368647,403927,408247,5905,41185,363745,45505,368065,403345,46105,368665,403945,408265,46201,368761,404041,408361,408961,872,5192,40472,363032,5792,41072,363632,45392,367952,403232,5888,41168,363728,45488,368048,403328,46088,368648,403928,408248,5906,41186,363746,45506,368066,403346,46106,368666,403946,408266,46202,368762,404042,408362,408962,5910,41190,363750,45510,368070,403350,46110,368670,403950,408270,46206,368766,404046,408366,408966,46224,368784,404064,408384,408984,409080,154,754,5074,40354,362914,850,5170,40450,363010,5770,41050,363610,45370,367930,403210,868,5188,40468,363028,5788,41068,363628,45388,367948,403228,5884,41164,363724,45484,368044,403324,46084,368644,403924,408244,872,5192,40472,363032,5792,41072,363632,45392,367952,403232,5888,41168,363728,45488,368048,403328,46088,368648,403928,408248,5906,41186,363746,45506,368066,403346,46106,368666,403946,408266,46202,368762,404042,408362,408962,873,5193,40473,363033,5793,41073,363633,45393,367953,403233,5889,41169,363729,45489,368049,403329,46089,368649,403929,408249,5907,41187,363747,45507,368067,403347,46107,368667,403947,408267,46203,368763,404043,408363,408963,5911,41191,363751,45511,368071,403351,46111,368671,403951,408271,46207,368767,404047,408367,408967,46225,368785,404065,408385,408985,409081,873,5193,40473,363033,5793,41073,363633,45393,367953,403233,5889,41169,363729,45489,368049,403329,46089,368649,403929,408249,5907,41187,363747,45507,368067,403347,46107,368667,403947,408267,46203,368763,404043,408363,408963,5911,41191,363751,45511,368071,403351,46111,368671,403951,408271,46207,368767,404047,408367,408967,46225,368785,404065,408385,408985,409081,5912,41192,363752,45512,368072,403352,46112,368672,403952,408272,46208,368768,404048,408368,408968,46226,368786,404066,408386,408986,409082,46230,368790,404070,408390,408990,409086,409104,874,5194,40474,363034,5794,41074,363634,45394,367954,403234,5890,41170,363730,45490,368050,403330,46090,368650,403930,408250,5908,41188,363748,45508,368068,403348,46108,368668,403948,408268,46204,368764,404044,408364,408964,5912,41192,363752,45512,368072,403352,46112,368672,403952,408272,46208,368768,404048,408368,408968,46226,368786,404066,408386,408986,409082,5913,41193,363753,45513,368073,403353,46113,368673,403953,408273,46209,368769,404049,408369,408969,46227,368787,404067,408387,408987,409083,46231,368791,404071,408391,408991,409087,409105,5913,41193,363753,45513,368073,403353,46113,368673,403953,408273,46209,368769,404049,408369,408969,46227,368787,404067,408387,408987,409083,46231,368791,404071,408391,408991,409087,409105,46232,368792,404072,408392,408992,409088,409106,409110,5914,41194,363754,45514,368074,403354,46114,368674,403954,408274,46210,368770,404050,408370,408970,46228,368788,404068,408388,408988,409084,46232,368792,404072,408392,408992,409088,409106,46233,368793,404073,408393,408993,409089,409107,409111,46233,368793,404073,408393,408993,409089,409107,409111,409112,46234,368794,404074,408394,408994,409090,409108,409112,409113,409113,409114};
int biao[1000010];
int main()
{
 int i,n;
 for(i=0; i<=1000000; i++)
  biao[i] = 0;
 for(i=0; i<1023; i++)
  biao[num[i]] = 1;
 while( scanf("%d",&n) != EOF && n >= 0 )
 {
  if( biao[n] == 1 )
   printf("YES/n");
  else
   printf("NO/n");
 }
return 0;
}

其实最后我还有一种想法就是把子集表示出来,也是打表,但是自己不会码,囧。。

转载来自:http://blog.sina.com.cn/s/blog_8ccc36af0101015l.html

 

先算出1到9的阶乘,然后开一个数组,存放这九个数任意组合的和
之后每读到一个数,就判断这个数在不在这个数组里面。
 
#include <iostream>
using namespace std;

int a[1035],p=11;

void run(int s,int sum)
{
sum+=a[s];
if (sum<1000000)
{
a[p++]=sum;
for (int j=s+1;j<11;j++)
run(j,sum);
}
}

int main()
{int i=1,k;
a[1]=1;
for (k=2;k<11;k++)
a[k]=a[k-1]*i++;
a[0]=0;
run(0,0);
do
{
cin>>i;
if (i>=0)
{
if (i==0) cout<<"NO";
else
{
for(k=1;k<1035;k++)
if (i==a[k]) break;
if (k==1035) cout<<"NO";
else cout<<"YES";
}
cout<<endl;
}
}
while (i>=0);
return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值