这道题出的很好,可以用很多方法来解答。
令我最深的是动态规划的转移方程。
数的划分这道题说白了就是给你一堆小球,让你将小球分成几堆。
#include<cstdio>
using namespace std;
int s[205][8];
void dp(int n,int k){
for(int i=1;i<=n;i++)
s[i][1]=1;
for(int i=2;i<=n;i++)
for(int j=2;j<=k;j++)
if(i>=j)
s[i][j]=s[i-1][j-1]+s[i-j][j];
}
int main (){
int n,k;
scanf("%d%d",&n,&k);
dp(n,k);
printf("%d",s[n][k]);
return 0;
}
下面是DFS
#include<cstdio>
using namespace std;
int ans;
void dfs(int x,int n,int k){
if(x>n)
return;
if(k==1){
ans++;
return;
}
for(int i=x;i<=n/k;i++)
dfs(i,n-i,k-1);
}
int main (){
int n,k;
scanf("%d%d",&n,&k);
dfs(1,n,k);
printf("%d",ans);
return 0;
}
//蒟蒻发布博客文章主要还是为了理清自己的思路,强化记忆。当然,如果能给此题有困惑的朋友提供一些思路,博主也非常高兴。希望大家不喜勿喷