目录
显示
题目链接
https://projecteuler.net/problem=76
大意
将 \(100\) 拆分成至少两个数字的可行方案数是多少?
题解
如果做过放苹果这道题目的话,想必做这道题目是比较轻松的。
我们令 \(f_{i,j}\) 表示将 \(i\) 拆分成 \(j\) 份的方案数。
那么我们就可以得到这个递推方程:
$$f_{i,j}=f_{i-1,j-1}+f_{i-j,j}$$
边界条件是\(f_{i,1}=1,f_{i,i}=1\)。
#include <iostream>
#include <cstring>
#include <cmath>
#define MAXN 100
using namespace std;
int f[105][105],ans;
int main()
{
for(int i=0;i<=MAXN;i++)
f[i][1]=1,f[i][i]=1;
for(int i=2;i<=MAXN;i++)
for(int j=1;j<=i;j++)
f[i][j]=f[i-1][j-1]+f[i-j][j];
for(int i=2;i<=MAXN;i++)//应该至少被拆分成两个数
ans+=f[MAXN][i];
cout<<ans;
return 0;
}