求助
查看原帖
求助
701221
Chr0n1CleC楼主2022/7/6 14:49

我的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; 
}
2022/7/6 14:49
加载中...