题目:鸣人的影分身
思路:
f[i][j]表示有j个分身,能量为i的方案数。
转移方程:
if(j<=i) f[i][j]=f[i][j-1]+f[i-j][j];
else f[i][j]=f[i][i];
即当能量足够分配给所有分身时,方案数等于分配给所有分身和不分配给所有分身的方案数之和。
当能量不够时,方案数等于i个能量刚好够分的方案数。
代码:
#include<bits/stdc++.h>
using namespace std;#define maxn 10int n,m;
int f[maxn+5][maxn+5]={0};int main(){for(int i=0;i<=maxn;i++) f[0][i]=1;for(int i=1;i<=maxn;i++){for(int j=1;j<=maxn;j++){if(j<=i) f[i][j]=f[i][j-1]+f[i-j][j];else f[i][j]=f[i][i];}}int T;scanf("%d",&T);while(T--){scanf("%d%d",&m,&n);printf("%d\n",f[m][n]);}return 0;
}