递归实现数字拆分

 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<cmath>
 6 #include<set>
 7 using namespace std;
 8
 9 void splitnum(int n, int k, int &way, vector<int> ans) //对n进行拆分,拆分数的最小值为k
10 {
11     if((n>=k && n<2*k) || n==0)
12     {
13         way++;
14         if(n!=0)
15             ans.push_back(n);
16
17         cout<<"way "<<way<<":"<<endl;
18         for(unsigned j=0; j<ans.size(); j++)
19             cout<<ans[j]<<" ";
20         cout<<endl;
21
22         return;
23     }
24
25     for(int i=k; i<=n; i++)
26     {
27         ans.push_back(i);
28
29         if(n-i>=i || n-i==0)
30             splitnum(n-i, i, way, ans);
31
32         ans.pop_back();
33
34     }
35 }
36
37 int main()
38 {
39     int T,n;
40     cin>>T;
41
42     for(int i=0; i<T; i++)
43     {
44         cin>>n;
45         int way=0;
46         splitnum(n, 1, way, vector<int>());
47         cout<<way<<endl;
48     }
49
50     return 0;
51 }

代码中包含了拆分的结果显示部分,题目中只需输出拆分种类数即可,对于给出的三个测试样例结果正确,其他结果有待验证,并且用递归实现非常耗时,提交后出现TLE。

运行结果:

递归实现数字拆分

时间: 2024-11-10 18:38:03

递归实现数字拆分的相关文章

【递归】数字三角形 简单dp

[递归]数字三角形 题目描述 对于大多数人来说,“我们是这么的正常,因此也就这么的平庸.”而天才总是与众不同的,所以当邪狼问修罗王:“老大,你蹲在那儿一动不动看了有半个小时了,蚂蚁有那么好看吗?” 修罗王是这样回答的:“我在思索人生的意义,你看这蚂蚁的面前有无数的道路选择,但它不知道选择哪条路可以到达目标,也不知道哪条路上有更多的食物,更不知道现在选择的道路对它以后的影响……” 如图所示,有一个层数为n(n≤1000)的数字三角形.现有一只蚂蚁从顶层开始向下走,每走下一级时,可向左下方向或右下方

hdu acm 1028 数字拆分Ignatius and the Princess III

Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11810    Accepted Submission(s): 8362 Problem Description "Well, it seems the first problem is too easy. I will let

LintCode-用递归打印数字

用递归的方法找到从1到最大的N位整数. 样例 给出 N = 1, 返回[1,2,3,4,5,6,7,8,9]. 给出 N = 2, 返回[1,2,3,4,5,6,7,8,9,10,11,...,99]. 注意 用下面这种方式去递归其实很容易: recursion(i) { if i > largest number: return results.add(i) recursion(i + 1) } 但是这种方式会耗费很多的递归空间,导致堆栈溢出.你能够用其他的方式来递归使得递归的深度最多只有 N

递归 - 求数字/字符串的全排列

例如: 字符串 abc,全排列为:abc,acb,bac,bca,cab,cba 数字 123,全排列为:123,132,213,231,312,321 代码: #include <iostream> #include <string> #include <algorithm> using namespace std; int tally = 0; void swapChar(string & _data, int _i, int _j) { char c; c

把1到100的数字拆分成字典中的两个键值对 python

需求:把1到100的列表拆分成字典中两个键值对,k1和k2. #!/usr/bin/python num = {} all_list = [] for nu in range(1101): all_list.append(nu) for i in all_list: if i < 75: if 'k1' in num.keys(): num['k1'].append(i) else: num['k1'] = [i, ] else: if 'k2' in num.keys(): num['k2']

例题:用函数递归求数字n 的阶乘

class Program { // 要理解递归,先要理解递归. (这只是一句玩笑话 ) // 递归,顾名思义就是递来归去,如此反复,直到不符合某个条件. 而函数递归意思也就是函数调用函数自己. 下面用代码来示例: public int jiecheng(int n) { // 用这个函数实现阶乘 , n表示阶乘的次数 if (n <= 1) return 1; else n= n *jiecheng (n - 1); return n; } static void Main(string[]

数据结构-递归输出数字

#include<stdio.h> void PrintN(int N){ if (N) { PrintN(N-1); printf("%d\n", N); } return;} int main(){ int N; scanf("%d", &N); PrintN(N); return 0; } 原文地址:https://www.cnblogs.com/minTTremor/p/9090185.html

[GO]将随机生成的四位数字拆分后放到一个切片里

package main import ( "math/rand" "time" "fmt" ) func InitData(p *int) { rand.Seed(time.Now().UnixNano()) var num int for { num = rand.Intn(10000) if num >= 1000 { break } } *p = num } func getNum(s []int, n int) { s[0] =

给定一个整数,求解该整数最少能用多少个Fib数字相加得到

一,问题描述 给定一个整数N,求解该整数最少能用多少个Fib数字相加得到 Fib数列,就是如: 1,1,2,3,5,8,13.... Fib数列,满足条件:Fib(n)=Fib(n-1)+Fib(n-2)   Fib(0)=1   Fib(1)=1:Fib数字,就是Fib数列中的某个数. 比如70 = 55+13+2,即一共用了3个fib数字得到 二,问题求解 ①求出所有小于等于N的Fib数字 //获得小于等于n的所有fib数 private static ArrayList<Integer>