为了确保出现过的方案不重复,
可以规定在后面的分组中的数必须要大于前面分组中的数,
x代表上一个出现过的数,初值为1,只要让下一个数从x开始循环,便可达成上述方案。
s代表还需多少次递归,初值为k,递归k次,即分为k组后便可退出循环。
t代表到此次还剩多大的数可以分,初值定为n。
同时循环最大只能进行到t/s,
避免出现因前面的数过大而导致后面的数无法取的情况。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
int i,j,s,a[8][300];
if(m==2){
cout<<n/2;
}
else {
for(i=2;i<=n;i++){
a[2][i]=i/2;
}
for(i=3;i<=m;i++){
for(j=0;j<=i;j++){
a[i][j]=0;
}
for(j=i;j<=n;j++){
a[i][j]=a[i-1][j-1]+a[i][j-i];
}
}
cout<<a[m][n];
}
return 0;
}