首页 > 其他分享 >题解:洛谷 P1025 [NOIP2001 提高组] 数的划分

题解:洛谷 P1025 [NOIP2001 提高组] 数的划分

时间:2025-01-23 19:31:26浏览次数:3  
标签:洛谷 NOIP2001 int 题解 sum 枚举 ans return 数字

题目https://www.luogu.com.cn/problem/P1025

解法1:深度优先搜素

准确来说是 DFS + 最优性剪枝。

我们在上一次选择的数字之后的范围进行枚举,记录这次选择的结果。

优化:记录之前的选择的数字之和,我们记为 sum,那么枚举的范围为 [a_{next},n-sum]

a 记录的是选择的数字。

如果顺利地枚举完了每一位数字,那么累加答案。

实现

#include<bits/stdc++.h>
using namespace std;
int n,k,ans,a[205];
void dfs(int x,int sum){
	if(x>k){
		ans+=(sum==n);
		return;
	}
	if(sum>n){
		return;
	}
	for(int i=a[x-1];i<=n-sum;i++){
		a[x]=i;
		dfs(x+1,sum+i);
	}
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>k;
	a[0]=1;
	dfs(1,0);
	cout<<ans;
	return 0;
}

解法2:动态规划

dp_{i,j} 表示数字 i 划分为 j 组有多少种方案数。

按照我们的状态设立,答案就是 dp_{n,m}

记得初始时 dp_{i,1}=1

实现

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,dp[205][15];
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		dp[i][1]=1;
		for(int j=2ll;j<=min(i,m);j++){
			dp[i][j]=(dp[i-1][j-1]+dp[i-j][j]);
		}
	}
	cout<<dp[n][m];
	return 0;
}

标签:洛谷,NOIP2001,int,题解,sum,枚举,ans,return,数字
From: https://blog.csdn.net/ATION001/article/details/145328260

相关文章

  • 题解:P4551 最长异或路径
    分析首先我们有如下结论:设两个节点到根节点的路径异或值为\(x_1,x_2\),则这两个节点之间的路径异或值为\(x_1\operatorname{xor}x_2\)。因此可以先求出每个节点到根节点的路径异或值,那么问题就转化成了:从\(n\)个整数中选两个进行异或运算,得到的结果最大是多少。考虑使......
  • [BZOJ4671] 异或图 题解
    我能说什么!抽象了这!看到\(n\le10\)的黑题顿感大事不妙。我们考虑设\(f(i)\)表示将\(n\)个点划分为至少\(i\)个连通块时的方案数。我们可以暴力枚举每个点在哪个连通块里。划分方案是\(Bell(n)\le21147\)的。显然的,相同块内暂时忽略,不同块间不能有边。于是我们将每......
  • [BZOJ3622] 已经没有什么好害怕的了 题解
    发现难以维护差值,于是令\(K=\frac{n+k}2\),这样就把问题转化为了“糖果”比“药片”大的组数为\(K\)的情况有多少种。设\(dp_{i,j}\)表示我们用前\(i\)个“糖果”和“药片”配对,至少有\(j\)组“糖果”比“药片”大,有多少种情况;\(c_i\)表示有多少个“药片”比第\(i\)个......
  • [BZOJ3622] 已经没有什么好害怕的了 题解
    发现难以维护差值,于是令\(K=\frac{n+k}2\),这样就把问题转化为了“糖果”比“药片”大的组数为\(K\)的情况有多少种。设\(dp_{i,j}\)表示我们用前\(i\)个“糖果”和“药片”配对,至少有\(j\)组“糖果”比“药片”大,有多少种情况;\(c_i\)表示有多少个“药片”比第\(i\)个......
  • [BZOJ4665] 小w的喜糖 题解
    我们先假设同种糖间存在差异。设\(f_{i,j}\)表示前\(i\)种糖至少有\(j\)人拿到的糖和原来一样,\(c_i\)表示拿第\(i\)种糖的人的个数,则有:\[f_{i,j}=\sum_{k=0}^{\min(j,c_i)}f_{i-1,j-k}\binom{c_i}kc_i^\underlinek\]设\(g_i\)表示所有人中恰好有\(i\)人拿到的糖......
  • [FJOI2016] 建筑师 题解
    显然有一个\(dp\)思路。设\(f_{i,j}\)表示现在修了\(i\)栋楼,从第一栋楼外侧能看到\(j\)栋楼的方案数,显然有:\[f_{i,j}=\begin{cases}[i=0](j=0)\\f_{i-1,j-1}+(i-1)f_{i-1,j}(j\ne0)\end{cases}\]一眼\(f_{i,j}=\begin{bmatrix}i\\j\end{bmatrix}\)。那么答案即为:\[\s......
  • [BZOJ5093] 图的价值 题解
    考虑计算一个点的贡献,最后\(\timesn\)即为所求。显然一个点的贡献为\(\sum\limits_{i=0}^{n-1}\binom{n-1}ii^k2^{\frac{(n-1)(n-2)}2}\),则有:\[\sum_{i=0}^{n-1}\binom{n-1}ii^k2^{\frac{(n-1)(n-2)}2}=2^{\frac{(n-1)(n-2)}2}\sum_{i=0}^{n-1}\sum_{j=0}^k\begin{Bmatrix}k......
  • [TJOI/HEOI2016] 求和 题解
    为什么又是佳媛姐姐啊啊啊!斯特林数在这道题中不好处理,直接拆开:\[f(n)=\sum_{i=0}^n\sum_{j=0}^i\begin{Bmatrix}i\\j\end{Bmatrix}2^jj!\]\[=\sum_{j=0}^n2^jj!\sum_{i=0}^n\sum_{k=0}^j\frac{(-1)^k(j-k)^i}{k!(j-k)!}\]\[=\sum_{j=0}^n2^jj!\sum_{k=0}^j\frac{(-1)^k\sum\l......
  • [联合省选 2020A] 组合数问题 题解
    后面有一只大大的组合数,考虑下降幂干过去。\(x^k\)并不好使,这边考虑转化\(f(x)=\suma_ix^i=\sumb_ix^\underlinei\)。\[\sum_{k=0}^nf(k)x^k\binomnk=\sum_{k=0}^nx^k\sum_{i=0}^mb_ik^\underlinei\binomnk\]\[=\sum_{k=0}^nx^k\sum_{i=0}^mb_in^\underlinei\binom{n-i......
  • 洛谷OI_树的刷题笔记
    整个笔记注意力惊人,慎入......持续更新。P2700逐个击破能卡住我的黄题已经很少见了,但这道题确实又是一个。唉,只能说自己依然是蒟蒻吧。不过,由于题目很容易理解,加上自己因为刷难题身心俱疲,“玩”一下这种简单的题目也算是种放松。不能因为刷题,把自己学算法的乐趣搞没了。先......