版本1
- 题目链接
- 转移方程
- dp[i][j] = dp[i-1][j] + dp[i-1][j-i]
- 初始化
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int N = 128;
int a[N];
int dp[N][N];
int main(){
int n, m;
scanf("%d %d", &n, &m);
memset(a, 0, sizeof a);
memset(dp, 0, sizeof dp);
for(int i = 0; i <= n; i++) dp[i][0] = 1;
for(int i = 1; i <= n; i++){
for(int j = 0; j <= m; j++){
if(j >= i) dp[i][j] = dp[i-1][j] + dp[i-1][j-i];
else dp[i][j] = dp[i-1][j];
}
}
printf("%d", dp[n][m]);
}
版本2
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int N = 128;
int a[N];
int dp[N];
int main(){
int n, m;
scanf("%d %d", &n, &m);
memset(a, 0, sizeof a);
memset(dp, 0, sizeof dp);
dp[0] = 1;
for(int i = 1; i <= n; i++){
for(int j = m; j >= i; j--){
dp[j] = dp[j-i] + dp[j];
}
}
printf("%d", dp[m]);
}