DFS法:
#include <iostream>
#include <vector>
using namespace std;
int n_sum = 0;
void findsolution(int sum, int currentsum, int start, int end, vector<int> &aa)
{
if (start>end) return;
if (currentsum == sum)
{
n_sum++;
for(int i=0;i<aa.size();i++)
{
cout<<aa[i]<<" ";
}
cout<<endl;
return;
}
if (currentsum + start>sum) return;
aa.push_back(start);
findsolution(sum, currentsum + start, start + 1, end, aa); //选择
aa.pop_back();
findsolution(sum, currentsum, start + 1, end, aa); //不选择
}
int main()
{
int n, m;
while (cin >> n >> m)
{
vector<int> ss;
findsolution(m, 0, 1, n + 1, ss);
cout << n_sum << endl;
n_sum = 0;
}
//cin.get();cin.get();
return 0;
}
动态规划法:
#include<iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> dp(n+1, vector<int>(m+1));
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 >= 0) {
dp[i][j] = dp[i - 1][j]+dp[i-1][j-i];
}
else {
dp[i][j] = dp[i - 1][j];
}
}
}
cout << dp[n][m];
return 0;
}