003:鸣人的影分身

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
" , 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
" , solve(m , n )) ; 
         
    }
    return 0 ; 
} 
原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/7584023.html