终于可以AC了
#include<iostream>
#include<sstream>
#include<vector>
#include<string>
#include<algorithm>
//#include<map>
using namespace std;
int Fun(int n,int m)
{
if(n==1||m==1)
{
return 1;
}
else if(n<m)
{
return Fun(n,n);
}
else if(n==m)
{
return 1+Fun(n,m-1);
}
else if(n>m)
{
return Fun(n-m,m)+Fun(n,m-1);
}
}
int main()
{
int inputnum=0;
while(scanf("%d",&inputnum)!=EOF)
{
cout<<Fun(inputnum,inputnum)<<endl;
}
return 0;
}
by 2020.03.16更新前
代码有问题,不能这样搞啊
描述
将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整数n 的这种表示称为正整数n 的划分。正整数n 的不同的划分个数称为正整数n 的划分数。
输入
标准的输入包含若干组测试数据。每组测试数据是一个整数N(0 < N <= 50)。
输出
对于每组测试数据,输出N的划分数。
样例输入
5
样例输出
7
提示
5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1
#include<iostream>
#include<sstream>
#include<vector>
#include<string>
#include<algorithm>
//#include<map>
using namespace std;
vector<string> Fun1(vector<string> vecstrsin)
{
vector<string> vecstrsret;
//每一个结果后面添加"+1"
int i=0,j=0,itemp=0;
for(i=0;i<vecstrsin.size();i++)
{
string strtemp=vecstrsin[i]+"+1";
vecstrsret.push_back(strtemp);
}
//每一个结果中每一项+1
for(i=0;i<vecstrsin.size();i++)
{
if(vecstrsin[i].find('+')==-1)
{
itemp=atoi(vecstrsin[i].c_str());
itemp++;
stringstream ss;
ss<<itemp;
vecstrsret.push_back(ss.str());
continue;
}
else
{
int iposbeg=0;
int iposlast=vecstrsin[i].rfind('+');
string strtemp=vecstrsin[i];
string strsin=vecstrsin[i];
for(j=0;j<vecstrsin[i].length();j++)
{
if(vecstrsin[i][j]=='+')
{
itemp=atoi(strsin.substr(iposbeg,j-iposbeg).c_str());
itemp++;
stringstream ss;
ss<<itemp;
strsin.replace(iposbeg,j-iposbeg,ss.str());
strtemp=vecstrsin[i];
vecstrsret.push_back(strsin);
strsin=vecstrsin[i];
iposbeg=j+1;
}
if(iposlast==j)
{
itemp=atoi(strsin.substr(j+1,strsin.length()-iposlast-1).c_str());
itemp++;
stringstream ss;
ss<<itemp;
strsin.replace(j+1,strsin.length()-j-1,ss.str());
strtemp=vecstrsin[i];
vecstrsret.push_back(strsin);
strsin=vecstrsin[i];
break;
}
}
}
}
return vecstrsret;
}
vector<string> FunDel(vector<string> vecstrsret)
{
sort(vecstrsret.begin(),vecstrsret.end());
vecstrsret.erase(unique(vecstrsret.begin(), vecstrsret.end()), vecstrsret.end());
return vecstrsret;
}
bool Comp(const int &a, const int &b)
{
return a>b;
}
//bool CompStr(const string &x,const string &y) //&符號不能少
//{
// return x>y;
//}
vector<string> FunSort(vector<string> vecstrsret)
{
for(int i=0;i<vecstrsret.size();i++)
{
vector<int> vecints;
int iposbeg=0,inumret=0,itemp=0;
string strtemp=vecstrsret[i];
for(int j=0;j<vecstrsret[i].length();j++)
{
int iposlast=vecstrsret[i].rfind('+');
if(vecstrsret[i][j]=='+')
{
itemp=atoi(vecstrsret[i].substr(iposbeg,j-iposbeg).c_str());
vecints.push_back(itemp);
iposbeg=j+1;
}
if(iposlast==j)
{
itemp=atoi(vecstrsret[i].substr(j+1,vecstrsret[i].length()-iposbeg).c_str());
vecints.push_back(itemp);
break;
}
}
if(vecints.size()>1)
{
sort(vecints.begin(),vecints.end(),Comp);
stringstream ss;
ss<<vecints[0];
strtemp=ss.str();
for(int k=1;k<vecints.size();k++)
{
stringstream ss1;
ss1<<vecints[k];
string str1=ss1.str();
strtemp=strtemp+"+"+ss1.str();
}
vecstrsret[i]=strtemp;
}
}
return vecstrsret;
}
int main()
{
int inputnum=0;
while(scanf("%d",&inputnum)!=EOF)
{
vector<string> vecstrsret,vecstrsin;
vecstrsin.push_back("1");
for(int i=2;i<=inputnum;i++)
{
vecstrsin=Fun1(vecstrsin);
vecstrsin=FunDel(vecstrsin);
}
vecstrsret=vecstrsin;
vecstrsret=FunSort(vecstrsret);
vecstrsret=FunDel(vecstrsret);
// sort(vecstrsret.begin(),vecstrsret.end(),CompStr);
// for(int j=0;j<vecstrsret.size();j++)
// {
// if(j==(vecstrsret.size()-1))
// cout<<vecstrsret[j]<<endl;
// else
// cout<<vecstrsret[j]<<",";
// }
cout<<vecstrsret.size()<<endl;
}
return 0;
}