标签:数据 std bsp include 排列 一个 ram result efi
在火影忍者的世界里,令敌人捉摸不透是非常关键的。我们的主角漩涡鸣人所拥有的一个招数——多重影分身之术——就是一个很好的例子。
影分身是由鸣人身体的查克拉能量制造的,使用的查克拉越多,制造出的影分身越强。
针对不同的作战情况,鸣人可以选择制造出各种强度的影分身,有的用来佯攻,有的用来发起致命一击。
那么问题来了,假设鸣人的查克拉能量为M,他影分身的个数为N,那么制造影分身时有多少种(用K表示)不同的分配方法?(影分身可以被分配到0点查克拉能量)
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 ; }
标签:数据 std bsp include 排列 一个 ram result efi
原文地址:http://www.cnblogs.com/yi-ye-zhi-qiu/p/7584023.html