迅雷校招-----整數求和
阿新 • • 發佈:2018-11-09
給定整數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
題目連結: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; }