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