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