003:鸣人的影分身
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
在火影忍者的世界里,令敌人捉摸不透是非常关键的。我们的主角漩涡鸣人所拥有的一个招数——多重影分身之术——就是一个很好的例子。影分身是由鸣人身体的查克拉能量制造的,使用的查克拉越多,制造出的影分身越强。
针对不同的作战情况,鸣人可以选择制造出各种强度的影分身,有的用来佯攻,有的用来发起致命一击。
那么问题来了,假设鸣人的查克拉能量为M,他影分身的个数为N,那么制造影分身时有多少种(用K表示)不同的分配方法?(影分身可以被分配到0点查克拉能量)
- 输入
- 第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
- 输出
- 对输入的每组数据M和N,用一行输出相应的K。
- 样例输入
-
1 7 3
- 样例输出
-
8 注意:需要求的是 i 点能量分给 j 个分身 时 能量分配的组合数 , 不需要考虑 能量分给分身时的 排列问题思路:result[i][j] 表示 i 点能量 分给 j 个分身 如果 能量 i 小于 分身 j 那么 result[i][j] = result[i][i] 如果能量 i 大于等于 分身 j 那么 result[i][j] 的上一个状态是 i 点能量分给 j-1 个分身(新添加的第j个分身能量为0) 和 i-j 点能量 分给 j 个分身 (从result[i-j][j]->result[i][j] 增加的 i-j 点能量 为 j 个分身每人加上一点)
#include <cstdio> #include <cstring> #define maxn 12 int t ; int m , n ; int result[maxn][maxn] ; void init(){ memset(result , 0 , sizeof(result)) ; for(int i=0 ; i<maxn ; i++){ result[0][i] = 1 ; } for(int i=0 ; i<maxn ; i++){ for(int j=1 ; j<maxn ; j++){ if(i<j) result[i][j] = result[i][i] ; else if(i>=j) result[i][j] = result[i][j-1] + result[i-j][j] ; } } return; } int main(){ scanf("%d" , &t) ; init() ; while(t--){ scanf("%d%d" , &m , &n) ; printf("%d\n" , result[m][n]) ; } return 0 ; }
#include <cstdio> #include <cstring> #define maxn 12 int t ; int m , n ; int result[maxn][maxn] ; int solve(int x , int y){ if(x==0) return 1 ;// 能量为 0 无论有多少分身 每个分身能量都为 0 分配种类数目为 1 if(y==0) return 0 ;// 无论有多少能量 没有分身就没办法分配 分配种类数目 为0 if(x<y) return solve(x , x ) ; if(x>=y) return solve(x , y-1) + solve(x-y , y) ; } int main(){ scanf("%d" , &t) ; while(t--){ scanf("%d%d" , &m , &n) ; printf("%d\n" , solve(m , n )) ; } return 0 ; }
时间: 2024-10-13 16:34:46