首页 > 试题广场 >

整数求和

[编程题]整数求和
  • 热度指数:3990 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解
给定整数n,取若干个1到n的整数可求和等于整数m,编程求出所有组合的个数。比如当n=6,m=8时,有四种组合:[2,6], [3,5], [1,2,5], [1,3,4]。限定n和m小于120

输入描述:
整数n和m


输出描述:
求和等于m的所有组合的个数。
示例1

输入

6 8

输出

4
#include <stdio.h>

int main(int argc, const char * argv[]){
    int a[120][120];
    int n, m;
    scanf("%d %d", &n, &m);
    
    // 初始化
    for(int i=1; i<=n; i++){
        a[i][0] = 0;
        a[0][i] = 0;
        a[i][1] = 1;
        if(i==1){
            a[1][i] = 1;
        }else{
            a[1][i] = 0;
        }
    }
    
    // 进行计算
    for(int i=2; i<=n; i++){
        for(int j=2; j<=m; j++){
            if(i>=j){
                // [1,j,i]
                // 分解 [j-1, j] + [j][j] + [j+1][j]
                // 1~j-1,可以成为组合的加数,即用1到j-1表示j,=> a[j-1][j]
                // j, 可以成为组合的加数,即刚好单个加数{j}表示j, => 1
                // j+1~j, 由于这些数都大于j,不可能成为加数 => 0
                a[i][j] = a[j-1][j] + 1;
            }else{
                // [1,i,j]
                // 分解 [i-1][j] + [i-1][j-i]
                // 加数中无i,从1~i-1中挑选几个数的和等于j => a[i-1][j]
                // 加数中有i,从1~i-1中挑选几个数的和加上i等于j,相当于,从1~i-1中挑选几个数的和等于 j-i => a[i-1][j-i]
                a[i][j] = a[i-1][j] + a[i-1][j-i];
            }
        }
    }
    printf("%d", a[n][m]);
    return 0;
}

发表于 2023-03-27 22:24:25 回复(0)