想学一下记忆化数组的解法
#include <iostream>
#include <vector>
#include <bitset>
#include <queue>
#include <cstring>
#define endl '\n'
using namespace std;
using ll = long long;
const int N = 1010;
int n, m, k;
ll res;
ll mem[10][210][210];
//u是当前在第几个空,val当前是第几个数,sum的当前的总和
ll dfs(int u, int val, int sum) {
if (mem[u][val][sum]) return mem[u][val][sum];
if (val > n || sum > n) return 0;
if (u > k) {
if (sum == n) {
return mem[u][val][sum] = 1;
}
return mem[u][val][sum] = 0;
}
ll temp = 0;
//不选当前这个数
temp += dfs(u, val + 1, sum);
//选这个数
temp += dfs(u + 1, val, sum + val);
//我感觉temp+=dfs(u, val + 1, sum)和dfs(u + 1, val, sum + val)
//这一步有问题,但我不知道问题出在哪
return mem[u][val][sum] = temp;
}
/*
void dfs(int u, int val, int sum) {
if (val > n || sum > n) return;
if (u > k) {
if (sum == n) res++;
return;
}
dfs(u + 1, val, sum + val);
dfs(u, val + 1, sum);
}
*/
int main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin >> n >> k;
cout << dfs(1,1,0);
return 0;
}