天梯赛集训-求分解
题目描述:
蒜头君特别喜欢数学。今天,蒜头君突发奇想:如果想要把一个正整数 n 分解成不多于 k 个正整数相加的形式,那么一共有多少种分解的方式呢? 蒜头君觉得这个问题实在是太难了,于是他想让你帮帮忙。 输入格式共一行,包含两个整数 n(1≤n≤300)和 k(1≤k≤300),含义如题意所示。 输出格式一个数字,代表所求的方案数。 Sample 1
| |||||
---|---|---|---|---|---|
代码:
1.递归方法(会超时):
#include<bits/stdc++.h>
using namespace std;
long long res,n,sum;
vector<int>a;
int k;
void dfs(int x,int y){
if(y==sum&&a.size()<=k){
res++;
return ;
}
if(sum>y)return ;
for(int i=x;i<=y;i++){
a.push_back(i);
sum+=i;
dfs(i,y);
a.pop_back();
sum-=i;
}
}
int main(){
cin>>n>>k;
dfs(1,n);
cout<<res<<endl;
return 0;
}
2.dp做法(AC做法):
#include<bits/stdc++.h>
using namespace std;
const int MAX=305;
long long dp[MAX][MAX];
int main(){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==1||j==1)dp[i][j]=1;
else if(i==j)dp[i][j]=dp[i][j-1]+1;
else if(i<j)dp[i][j]=dp[i][i];
else if(i>j)dp[i][j]=dp[i-j][j]+dp[i][j-1];
}
}
cout<<dp[n][k]<<endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人