1. 程式人生 > >迅雷校招-----整數求和

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

 

給定整數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;
}