迅雷校招-----整数求和

给定整数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

输出例子1:

4

思路:这题是个二维动态规划,dp[i][j]代表i个数(从1-i)和是j的组合数,状态转移方程:dp[i][j]=dp[i-1][j-i]+dp[i-1][j];

举个例子,i=2,j=2,dp[2][2]=dp[1][0]+dp[1][2],结果是   dp[1][2-2]     +     dp[1][2], 好好体会根据dp[i][j]含义体会状态方程。

题目链接:https://www.nowcoder.com/question/next?pid=12398581&qid=247585&tid=19096674

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int main()
{
   int dp[122][122];
   memset(dp,0,sizeof(dp));
   int n,m;
   cin>>n>>m;
   for(int i=0;i<=n;i++)
    dp[i][0]=1;
   for(int i=1;i<=n;i++)
   {
       for(int j=1;j<=m;j++)
       {
           if(j>=i)
           dp[i][j]=dp[i-1][j-i]+dp[i-1][j];
           else
            dp[i][j]=dp[i-1][j];
       }
   }
   cout<<dp[n][m];
    return 0;
}

猜你喜欢

转载自blog.csdn.net/salmonwilliam/article/details/82909459
今日推荐