题目背景
将整数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;
}
我的代码感觉没问题,是哪里有错?
请将全部代码给我开一眼。我刚入门,不怎么懂!
书的前面有类似的例题,难度不大,先声明一个长度为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;
}