zoukankan      html  css  js  c++  java
  • 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 ; 
    } 
  • 相关阅读:
    ubuntu 16.0.5 修改网卡为固定IP
    Ubuntu PostgreSQL安装和配置
    NPOI 1.2.1版本替换为2.4.0版本实体类变更
    C# 之 Math取整
    解决github 下载过慢的问题
    优伦自动语言话务员设置
    python3学习笔记 列表
    【postgresql】role "root" does not exist 解决办法
    Eclipse使用的小技巧
    Servlet
  • 原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/7584023.html
Copyright © 2011-2022 走看看