P1025 [NOIP2001 提高组] 数的划分———C++(动态规划、DFS)

这篇具有很好参考价值的文章主要介绍了P1025 [NOIP2001 提高组] 数的划分———C++(动态规划、DFS)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

[NOIP2001 提高组] 数的划分

题目描述

将整数 n n n 分成 k k k 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。

例如: n = 7 n=7 n=7 k = 3 k=3 k=3,下面三种分法被认为是相同的。

1 , 1 , 5 1,1,5 1,1,5;
1 , 5 , 1 1,5,1 1,5,1;
5 , 1 , 1 5,1,1 5,1,1.

问有多少种不同的分法。

输入格式

n , k n,k n,k 6 < n ≤ 200 6<n \le 200 6<n200 2 ≤ k ≤ 6 2 \le k \le 6 2k6

输出格式

1 1 1 个整数,即不同的分法。

样例 #1

样例输入 #1

7 3

样例输出 #1

4

提示

四种分法为:
1 , 1 , 5 1,1,5 1,1,5;
1 , 2 , 4 1,2,4 1,2,4;
1 , 3 , 3 1,3,3 1,3,3;
2 , 2 , 3 2,2,3 2,2,3.

【题目来源】

NOIP 2001 提高组第二题

动态规划的解题思路

  • 动态规划,相当于把n个小球放到k个箱子里面,问有几种分法。
  • dp[i][j]相当于把第i个小球放到第j个箱子里。
  • 状态初始化:dp[i][1] = 1
  • 状态转移方程:dp[i][j] = dp[i - 1][j - 1] + dp[i - j][j]

Code

#include<iostream>

using namespace std;

int n, k;
int dp[210][10];

int main() {
	cin >> n >> k;
	for (int i = 0; i <= n; i++) {
		dp[i][1] = 1; // 状态初始化
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 2; j <= k; j++) {
			if (i >= j) {
				dp[i][j] = dp[i - 1][j - 1] + dp[i - j][j];
			}
		}
	}
	cout << dp[n][k] << endl;
	return 0;
}

运行结果

P1025 [NOIP2001 提高组] 数的划分———C++(动态规划、DFS),# 计算机复试知识,# 洛谷C、C++算法题,c++,算法,动态规划

DFS

Code

#include<iostream>

using namespace std;

int ans;

void dfs(int m, int k, int n) {
	if (k == 1) {
		ans++;
		return;
	}
	for (int i = m; i <= n / k; i++) {
		dfs(i, k - 1, n - i);
	}
}


int main() {
	int n, k;
	cin >> n >> k;
	dfs(1, k, n);
	cout << ans;
	return 0;
}

运行结果

P1025 [NOIP2001 提高组] 数的划分———C++(动态规划、DFS),# 计算机复试知识,# 洛谷C、C++算法题,c++,算法,动态规划文章来源地址https://www.toymoban.com/news/detail-815158.html

到了这里,关于P1025 [NOIP2001 提高组] 数的划分———C++(动态规划、DFS)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【洛谷 P1024】[NOIP2001 提高组] 一元三次方程求解 题解(数学+二分答案)

    有形如: a x 3 + b x 2 + c x + d = 0 a x^3 + b x^2 + c x + d = 0 a x 3 + b x 2 + c x + d = 0 这样的一个一元三次方程。给出该方程中各项的系数( a , b , c , d a,b,c,d a , b , c , d 均为实数),并约定该方程存在三个不同实根(根的范围在 − 100 -100 − 100 至 100 100 100 之间),且根与根之差的绝对值

    2024年02月06日
    浏览(24)
  • 【动态规划】C++算法:446等差数列划分 II - 子序列

    视频算法专题 动态规划汇总 给你一个整数数组 nums ,返回 nums 中所有 等差子序列 的数目。 如果一个序列中 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该序列为等差序列。 例如,[1, 3, 5, 7, 9]、[7, 7, 7, 7] 和 [3, -1, -5, -9] 都是等差序列。 再例如,[1, 1, 2, 5, 7] 不是

    2024年02月03日
    浏览(28)
  • P1125 [NOIP2008 提高组] 笨小猴——C++

    笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设 maxn text{maxn} maxn 是单词中出现次数最多的字母的出现次数, minn text{minn} minn 是单词中出

    2024年02月02日
    浏览(26)
  • 【蓝桥杯/动态规划】数的计算

    题目描述 输入一个自然数 n (n≤1000)n (n leq 1000) n   ( n ≤ 1 0 0 0 ) ,我们对此自然数按照如下方法进行处理: 不作任何处理; 在它的左边加上一个自然数,但该自然数不能超过原数的一半; 加上数后,继续按此规则进行处理,直到不能再加自然数为止。 问总共可以产生多少个数。

    2024年02月01日
    浏览(34)
  • P1030 [NOIP2001 普及组] 求先序排列

    给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 ≤8≤8)。 共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。 共一行一个字符串,表示一棵二叉树的先序。 输入 #1 复制 输出 #1 复制

    2023年04月22日
    浏览(30)
  • 【洛谷 P1029】[NOIP2001 普及组] 最大公约数和最小公倍数问题 题解(更相减损术)

    输入两个正整数 x 0 , y 0 x_0, y_0 x 0 ​ , y 0 ​ ,求出满足下列条件的 P , Q P, Q P , Q 的个数: P , Q P,Q P , Q 是正整数。 要求 P , Q P, Q P , Q 以 x 0 x_0 x 0 ​ 为最大公约数,以 y 0 y_0 y 0 ​ 为最小公倍数。 试求:满足条件的所有可能的 P , Q P, Q P , Q 的个数。 一行两个正整数 x 0 , y 0

    2024年02月09日
    浏览(31)
  • 【学会动态规划】等差数列划分(22)

    目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 学习一个算法没有捷径,更何况是学习动态规划, 跟我一起刷动态规划算法题,一起学会动态规划! 题目链接:413. 等差数列划分 - 力扣(

    2024年02月11日
    浏览(42)
  • 【动态规划刷题 12】等差数列划分&& 最长湍流子数组

    链接: 139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例 1: 输入: s = “leetcode”, wordDict = [“leet”, “code”] 输出: t

    2024年02月09日
    浏览(26)
  • 算法题——华为OD机试——整数划分排序/员工分月饼——动态规划——Java

    一个考察动态规划的机试题的数学模型建立,和两种思路的取舍 公司分月饼,m个员工,买了n个月饼,m = n,每个员工至少分一个月饼,但是也可以分到多个,单人分到最多月饼的个数是Max1,单人分到第二多月饼个数是Max2。 但需要满足Max1-Max2 = 3,单人分到第n-1多月饼个数是

    2024年03月16日
    浏览(43)
  • 【动态规划 区间dp 位运算】100259. 划分数组得到最小的值之和

    动态规划 区间dp 位运算 给你两个数组 nums 和 andValues,长度分别为 n 和 m。 数组的 值 等于该数组的 最后一个 元素。 你需要将 nums 划分为 m 个 不相交的连续 子数组,对于第 ith 个子数组 [li, ri],子数组元素的按位AND运算结果等于 andValues[i],换句话说,对所有的 1 = i = m,n

    2024年04月15日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包