题目大意:给出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的阶乘,然后开一个数组,存放这九个数任意组合的和
之后每读到一个数,就判断这个数在不在这个数组里面。