一本通——数的划分
题目链接
数的划分https://loj.ac/p/10018这个题应该是一个dfs深搜的剪枝优化问题,但是似乎用dp也能做,因此写了两个版本的题解
深搜版本
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N];
int n,k;
int ans;
void dfs(int x){
if(n==0){
return ;
}
if(x==k){
if(n>=a[x-1]){
ans++;
}
return ;
}
for(int i=a[x-1];i<=n/(k-x+1);i++){
a[x]=i;
n-=i;
dfs(x+1);
n+=i;
}
}
int main(){
cin>>n>>k;
a[0]=1;
//初始化,一开始只能从1开始
dfs(1);
cout<<ans<<endl;
return 0;
}
dp版本
#include<stdio.h>
int dp[210][10];
int main()
{
int n,k,i,j;
scanf("%d %d",&n,&k);
dp[0][0]=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=k;j++)
{
if(i>=j) //j不能大于i
{
dp[i][j]=dp[i-1][j-1]+dp[i-j][j];
}
}
}
printf("%d\n",dp[n][k]);
return 0;
}