我的dfs代码是已经过了的,但不过我dfs转dp特别的菜,所以说打了一遍dp,但不过只有40分,代码如下:
#include<stdio.h>
int n, k;
int dp[209][19][209];
bool vis[209][19][209];
int dfs(int i, int le, int sum)
{
if (vis[i][le][sum])
return dp[i][le][sum];
if (le == k && sum == n)
return 1;
if (i > n || le >= k || sum >= n)
return 0;
int ret = 0;
for (int j = 1;sum + j * i <= n;j ++)
ret += dfs(i + 1, le + j, sum + i * j);//yes
ret += dfs(i + 1, le, sum);//no
vis[i][le][sum] = 1;
return dp[i][le][sum] = ret;
}
int main()
{
scanf("%d%d", &n, &k);
// printf("%d", dfs(1, 0, 0));
for (int i = 1;i <= n;i ++)
dp[i][k][n] = 1;
for (int i = n;i >= 1;i --)
for (int le = k - 1;le >= 0;le --)
for (int sum = n;sum >= 0;sum --)
{
for (int j = 1;sum + i * j <= n;j ++)
dp[i][le][sum] += dp[i + 1][le + j][sum + i * j];
dp[i][le][sum] += dp[i + 1][le][sum];
}
printf("%d", dp[1][0][0]);
return 0;
}