回溯与搜索 五 数的划分(NOIP2001)

简介: 回溯与搜索 五 数的划分(NOIP2001)

数的划分(NOIP2001)

【问题描述】

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

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

问有多少种不同的分法。

【输入格式】

n,k      (6<n≤200,2≤k≤6)

【输出格式】

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

【输入样例】    

7 3

【输出样例】

4

{4种分法为:1,1,5;1,2,4;1,3,3;  2,2,3 说明部分不必输出}

1. //回溯 递推 全排列 超时
2. #include<iostream>
3. #include<cstdio>
4. #include<iomanip>
5. using namespace std;
6. int n,k,sum=0;
7. int s[8]={0}; 
8. int main()
9. {
10.   cin>>n>>k;
11.   int i=1;
12.   while(i){
13.     s[i]++;
14.     if(s[i]>n) i--;
15.     else if(i==k){
16.       int su=0;
17.       for(int j=1;j<=k;j++) su+=s[j];
18.       if(n==su) sum++;
19.     }
20.     else{
21.       i++;
22.       s[i]=s[i-1]-1;  
23.     }
24.   }
25.   cout<<sum;  
26.   return 0;
27.  }
1. //递归法
2. #include<iostream>
3. #include<cstdio>
4. #include<iomanip>
5. using namespace std;
6. int n,k;
7. int fin(int a,int b,int c)
8. {
9.  int sum=0;
10.   if(b==1) sum=1;
11.   else {
12.     for(int i=c;i<=a/b;i++)
13.       sum+=fin(a-i,b-1,i);
14.   } 
15.   return sum;
16. }
17. int main()
18. {
19.   cin>>n>>k;
20.   cout<<fin(n,k,1);
21.   return 0;
22.  }
1. //动态穷举 剪枝 
2. #include<iostream>
3. #include<cstdio>
4. #include<iomanip>
5. using namespace std;
6. int n,k,sum=0;
7. int min(int x,int y)
8. {
9.  if(x<y) return x;
10.   else return y;
11. }
12. void work(int a,int b,int c)
13. {
14.   int i;
15.   if(a==0) sum++;
16.   else {
17.     for(i=min(b-a+1,c);i>=b/a;i--)
18.       work(a-1,b-i,i);
19.   }
20. }
21. int main()
22. {
23.   cin>>n>>k;
24.   work(k,n,n);
25.   cout<<sum;
26.   return 0;
27.  }
1. //递推 找到递推方程 
2. #include<iostream>
3. #include<cstdio>
4. #include<iomanip>
5. using namespace std;
6. int n,k;
7. int s[201][7]={0}; 
8. int main()
9. {
10.   cin>>n>>k;
11.   s[0][0]=1;
12.   for(int i=1;i<=n;i++) s[i][1]=1;
13.   for(int i=1;i<=n;i++)
14.     for(int j=2;j<=(min(i,k));j++)
15.       for(int t=1;t<=(min(i,j));t++)
16.         s[i][j]+=s[i-t][min(i-t,t)];
17.   cout<<s[n-k][k];
18.   return 0;
19.  }

 

相关文章
|
8月前
|
算法 测试技术 C#
区间合并|LeetCode2963:统计好分割方案的数目
区间合并|LeetCode2963:统计好分割方案的数目
|
7月前
|
存储 算法 测试技术
每日练习之广义搜索——小红的素数合并
每日练习之广义搜索——小红的素数合并
41 1
|
8月前
|
人工智能 BI
经典问题之区间分组
经典问题之区间分组
|
8月前
|
机器学习/深度学习 移动开发
【归并排序】【图论】【动态规划】【 深度游戏搜索】1569将子数组重新排序得到同一个二叉搜索树的方案数
【归并排序】【图论】【动态规划】【 深度游戏搜索】1569将子数组重新排序得到同一个二叉搜索树的方案数
|
8月前
|
索引 Python C++
C/C++每日一练(20230418) 搜索插入位置、最长有效括号、子集
C/C++每日一练(20230418) 搜索插入位置、最长有效括号、子集
75 0
C/C++每日一练(20230418) 搜索插入位置、最长有效括号、子集
|
算法 索引
【算法挨揍日记】day08——30. 串联所有单词的子串、76. 最小覆盖子串
给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如,如果 words = [&quot;ab&quot;,&quot;cd&quot;,&quot;ef&quot;], 那么 &quot;abcdef&quot;, &quot;abefcd&quot;,&quot;cdabef&quot;, &quot;cdefab&quot;,&quot;efabcd&quot;, 和 &quot;efcdab&quot; 都是串联子串。 &quot;acdbef&quot; 不是串联子串,因为他不是任何 words 排列的连接。
389 0
P1308 [NOIP2011 普及组] 统计单词数(模拟加函数+数学分析)
P1308 [NOIP2011 普及组] 统计单词数(模拟加函数+数学分析)
86 0
|
算法
回溯与搜索 一 全排列问题
回溯与搜索 一 全排列问题
|
iOS开发 索引
LeetCode--1773. 统计匹配检索规则的物品数量
给你一个数组 items ,其中 items[i] = [typei, colori, namei] ,描述第 i 件物品的类型、颜色以及名称。 另给你一条由两个字符串 ruleKey 和 ruleValue 表示的检索规则。 如果第 i 件物品能满足下述条件之一,则认为该物品与给定的检索规则 匹配 : ruleKey == "type" 且 ruleValue == typei 。 ruleKey == "color" 且 ruleValue == colori 。 ruleKey == "name" 且 ruleValue == namei 。 统计并返回 匹配检索规则的物品数量 。
85 0
|
算法 Java Python
【算法题解】 Day30 搜索与回溯
今天的算法是 「搜索与回溯」 相关,“算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,以实战习题的形式理解算法,使用算法。”
116 0