已知五个互不相同的正整数之和为23,且从这五个数中挑选若干个加起来可以表示从1到23之内的全部自然数。问这五个数是什么?
#include <iostream>
#include <bitset>
#include <vector>
using namespace std;
void zuhe(int* nData,int len,int cur,int num);//组合函数
vector<int> nVecTmp;
bitset<23> bs;//23位来检测是否能组成23,当每位都为1时就说明可以组成23
int main()
{
int i,j,m,n,k;
int nNum[5] = {0};
for (i=1;i<23;++i)
for(j=i+1;j<23;++j)
for(m=j+1;m<23;++m)
for(n=m+1;n<23;++n)
{
k = 23-i-j-m-n;
if(k>n){
nNum[0] = i;
nNum[1] = j;
nNum[2] = k;
nNum[3] = m;
nNum[4] = n;
bs.reset();
for(int t=1;t!=6;++t){//穷举所有的组合
zuhe(nNum,5,0,t);
nVecTmp.clear();
}
if(bs.count() == 23){
cout<<i<<" "<<j<<" "<<m<<" "<<n<<" "<<k<<endl;
}
}
}
return 0;
}
void zuhe(int* nData,int len,int cur,int num)
{
if (num == 0){
int t=0;
for(size_t i=0;i!=nVecTmp.size();++i){
t += nVecTmp[i];
}
bs.set(t-1);
}
for (int i=cur;i!=len;++i)
{
nVecTmp.push_back(nData[i]);
zuhe(nData,len,i+1,num-1);
nVecTmp.pop_back();
}
}