数的划分【传送门】

算法的话,dfs+剪枝;

据说是01年之前的NOIp提高组;


思路:

这道题是求把n无序的划分成k份的方案数,最直接的搜索方法是依次枚举x1,x2……xk的值,然后判断,显然这么搜索的话,很容易就TLE了qwq。所以我们需要剪枝,这道题用到的主要是可行性剪枝和上下界剪枝;

①因为本题不考虑分解的顺序,所以我们可以规定分成的这k个数是从小到大分的,即a[i]<=a[i+1]。

②假设我们已经把n分解为i-1个数分别为a[1],a[2]……a[i-1](其中a[1]<=a[2]<=……<=a[i-1]),那么a[i]的最大值是将剩余k-i+1个数平均划分,即设m=n-(a[1]+a[2]+……+a[i-1]),那么a[i]<=m/(k-i+1),所以对于每个a[i],扩展上届为m/(k-i+1);

经过剪枝,好像就快一点了qwq;

#include<bits/stdc++.h>

using namespace std;

int n,m,a[],s;
void dfs(int k){
if(n==) return;
if(k==m){
if(n>=a[k-]) s++;//计数
return;
}
for(int i=a[k-];i<=n/(m-k+);i++){//剪枝
a[k]=i;//选择i作为a[k]的值
n-=i;
dfs(k+);
n+=i;//回溯;
}
} int main(){
cin>>n>>m;
a[]=;
dfs();//从1开始划分
cout<<s<<endl;
return ;
}

最新文章

  1. python进阶笔记 thread 和 threading模块学习
  2. 黄聪:解决Web部署 svg/woff/woff2字体 404错误
  3. JQuery Datatables服务器端处理示例
  4. mysql 得到重复的记录
  5. python 代码片段19
  6. [转]倍数提高工作效率的 Android Studio 奇技
  7. LeetCode() Word Search II
  8. hdoj 1863 畅通工程
  9. hdu_5691_Sitting in Line(状压DP)
  10. [LeetCode] Array Partition I 数组分割之一
  11. unity网络----简单基础
  12. 奇怪,Linux下find找不到文件了
  13. Apollo源码阅读笔记(一)
  14. BSGS-Junior&#183;大步小步算法
  15. 两个线程分别打印 1- 100,A 打印偶数, B打印奇数。
  16. Golang socket
  17. 小程序点击跳转外部链接 微信小程序提示:不支持打开非业务域名怎么办 使用web-view 配置业务域名
  18. Mybatis-Plus 实战完整学习笔记(五)------insert测试
  19. Market Guide for AIOps Platforms
  20. vue知识点之day5

热门文章

  1. vue-cli-webpake搭建和配置
  2. jquery 使用a标签导航栏跳转页面,动态添加高亮
  3. 树——binary-tree-maximum-path-sum(二叉树最大路径和)
  4. CreateProcessAsUser 服务调用
  5. 关于pug的笔记
  6. LeetCode--053--最大子序和(java)
  7. ht-2 arrayList特性
  8. linux运维、架构之路-MySQL主从复制
  9. linux运维、架构之路-内网NTP时间服务器
  10. Gym - 101194H Great Cells