poj1664【DFS】
思路:搜一下,还想多了,记得以前做过把一个数搞成几个数的相加组合,然后这题无非就是多了个组合的个数<=m的,那么只要多加一个条件,当num>m的时候也return掉就好了。
//#include <bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const double eps=1e-5;
const double pi=acos(-1.0);
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
const int N=1e5+10;
int k,n,m;
LL ans;
int d[N];
void dfs(int x,int sum,int y,int num)
{
if(sum==n&&num<=m){
ans++;
/* for(int i=0;i<num;i++){
printf("%d ",d[i]);
}
puts("");*/
return;
}
if(num>m){
return;
}
for(int i=x;i<=n;i++){
if(sum+i<=n){
d[num]=i;
dfs(i,sum+i,y+1,num+1);
}
}
}
int main()
{
int i;
int t;
cin>>t;
while(t--){
cin>>n>>m;
ans=0;
dfs(1,0,0,0);
cout<<ans<<endl;
}
return 0;
}