poj 1664
题目大意:
解决:dfs,整数划分问题,
#include <iostream>
using namespace std;
int n,m,cnt;
int res[15];
bool check()
{
for(int i=1;i<n;i++)
if(res[i]<res[i-1])return false;
return true;
}
void dfs(int deep,int cur_app,int p)
{
//deep>n比不可少,本来以为不要也行,但是由于下边的条件不一定总是满足,
//可能导致死循环了,所以很有必要独立写出一行
if(deep>n)return;
if(deep==n && cur_app==0 && check())
{ /*check函数的作用,由于511和115是同样的一种分配方法,但是都会出现,
所以按照一定的规则放,让不属于这个规则的其他的排列方式过滤掉就行了,
此处我用的是按照从大到小的顺序排放,先放大的,后放小的,就行了*/
cnt++;
return;
}
for(int i=cur_app;i>=0;i--)
{
res[p]=i;
dfs(deep+1,cur_app-i,p+1);
}
}
int main()
{
int icase;
cin>>icase;
while(icase--)
{
cnt=0;
cin>>m>>n;
dfs(0,m,0);
cout<<cnt<<endl;
}
system("pause");
return 0;
}