C++ “数的划分”结果报错

题目背景
将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
如 1,2,3 与 2,1,3 一致。
问有多少种不同的分法。

输入格式
n,k

输出格式
一个整数,即不同的分法

输入输出样例
输入样例
7 3
输出样例
4

说明 / 提示
时间限制:1.0s 内存限制:256.0MB
6<n<=200,2<=k<=6

我的代码

#include<iostream>
using namespace std;
int dp[205][10];
 
int main(){
    int n,k;
    cin>>n>>k;
    
    dp[0][0]=1;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=i && j<=k; j++){
            dp[i][j]=dp[i-j][j]+dp[i-1][j-1];
        }
    }
    cout<<dp[n][k]<<endl;
    return 0;
}

我的代码感觉没问题,是哪里有错?
请将全部代码给我开一眼。我刚入门,不怎么懂!

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7724693
  • 除此之外, 这篇博客: C++算法设计与分析课后习题(第三章)中的 十二,有52张牌,使它们全部正面朝上,第一轮是从第2张开始,凡是2的倍数位置上的牌翻成正面朝下;第二轮从第3张牌开始,凡是3的倍数位置上的牌,正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;第三轮从第4张牌开始,凡是4的倍数位置上的牌按上面相同规则翻转,以此类推,直到翻的牌超过104张为止。统计最后有几张牌正面朝上,以及他们的位置号。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 书的前面有类似的例题,难度不大,先声明一个长度为52的数组,然后统一赋值为1,接下来创建一个大循环用于计算是否翻了超过104张牌,然后小循环用于遍历数组,查找能被当前倍数整除的数字编号并修改值,小循环执行后倍数的数字加一。

    #include <iostream>
    using namespace std;
    int main()
    {
    	int a[52], count{}, b{ 2 }, countUP{};
    	for (int i = 0; i < 52; i++)
    		a[i] = 1;
    	while (count <= 104)//大循环退出条件
    	{
    		for (int i = 0; i < 52; i++)//遍历数组
    		{
    			if ((i + 1) % b == 0)//检查是否能整除
    			{
    				if (a[i] == 1)//如果为正面朝上
    				{
    					a[i] = 0;//则改为正面朝下
    					count++;//翻牌次数加一
    					if (count > 104)//如果翻牌次数大于104则退出循环
    						break;
    				}
    				else if (a[i] == 0)//如果为正面朝下
    				{
    					a[i] = 1;//则改为正面朝上
    					count++;//翻牌次数加一
    					if (count > 104)//如果翻牌次数大于104则退出循环
    						break;
    				}
    			}
    		}
    		b++;
    	}
    	cout << "第 ";
    	for (int i = 0; i < 52; i++)//输出值
    	{
    		if (a[i] == 1)
    		{
    			countUP++;
    			cout << i+1 << "、";
    		}
    	}
    	cout << " 张牌正面朝上   一共有" << countUP << "张" << endl;
    }