题意:问从[1,n]中挑若干个数组成m的方案数,保证n,m <=120
思路:
- 若n>m,dp[n][m]=dp[m-1][m]
- 若n==m,dp[n][m]=dp[m-n][m]+1
- 若n<m,考虑n是否在答案中dp[n][m]=dp[n-1][m-n] + dp[n-1][m]
复杂度:O(n*m),其实也可以用滚动数组写,空间上是2*m
#include<bits/stdc++.h>
using namespace std;
int dp[200][200];
int main(){
memset(dp,0,sizeof dp);
int i,j;
scanf("%d%d",&i,&j);
for(int n=1;n<=i;n++){
for(int m=1;m<=j;m++){
if(n>m) dp[n][m]=dp[m][m];
else if(n==m) dp[n][m]=dp[m-1][m]+1;
else dp[n][m]=dp[n-1][m-n]+dp[n-1][m];
}
}
printf("%d\n",dp[i][j]);
return 0;
}