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; }