发布时间:2023-04-22 18:30
前言:没时间写,只写了写代码,不能保证全对,挑的题也都是简单的。回溯的题自己写的不对,找的别人的写了下
3、整数因子分解
大于1的正整数n可以分解为:n=x1×x2×……×xm。
例如,当n=12时,共有8种不同的分解式:
12=12
12=6×2
12=4×3
12=3×4
12=3×2×2
12=2×6
12=2×3×2
12=2×2×3
输入:
数据有多行,给定正整数(正整数小于10000000)
输出:
每个数据输出一行,是正整数n的不同分解式数量。
输入样例
12
35
输出样例
8
3
#include
#include using namespace std; int resolve(int n) { int count = 1, i; // ans = 1初始表示n = n的情况 for (i = 2; i * i < n; i++){ if (n % i == 0) // i 是 n的因子, n / i也是n的因子 count += resolve(i) +resolve(n / i); } if (i * i == n) // i是n的因子, 并且i * i == n时只有这一种情况, 左右交换也是一种 count += resolve(i); return count; } int main() { int n; while(scanf(\"%d\",&n)!=-1){ cout<
4、台阶问题
问题描述:有n级台阶,一个人每次上一级或者两级,问有多少种走完n级台阶的方法。
实际情况:给定一个矩阵m,从左上角开始每次只能向右走或者向下走,最后达到右下角的位置,路径中所有数字累加起来就是路径和,返回所有路径的最小路径和,如果给定的m如下,那么路径1,3,1,0,6,1,0就是最小路径和,返回12.
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0
#include
using namespace std; const int N=10; int m[N][N]; int main(){ int n; cin>>n; for(int i=0;i >m[i][j]; } } int dp[n][n]={0}; for(int i=0;i dp[i][j+1]){ cout<
1、文件连接问题:给定一个大小为n的数组F,数组元素F[i]表示第i个文件的长度。现在需要将所有文件合并成一个文件,文件越长后面连接成新文件花费的时间越长,试给出贪心算法给出文件连接顺序,保证连接文件花费的时间最短。
#include
#include #include using namespace std; const int N=100; // 文件连接问题:给定一个大小为n的数组F,数组元素F[i]表示第i个文件的长度。 // 现在需要将所有文件合并成一个文件, // 文件越长后面连接成新文件花费的时间越长,试给出贪心算法给出文件连接顺序, // 保证连接文件花费的时间最短。 int main(){ int n; cin>>n; int F[N],P[N]; for(int i=0;i >F[i]; } for(int i=0;i
回溯:
1、素数环问题
(1)问题描述:输入正整数n,把整数1,2,3,4…..n组成一个环,使得相邻的两个整数之和均为素数。
(2)样例
输入:
6
输出:
1 4 3 2 5 6
1 6 5 2 3 4
(3)提示:n=4时的搜索解空间树。
#include
#include using namespace std; int n=0; const int N=105; int a[N]; //对应环 int visit[N]={-1}; //标记数组 0表示未用 1表示已用 int check(int k) //判断数字x是否为素数 { int i,n; n=(int)sqrt(k); for(i=2;i<=n;i++) if(k%i==0) return 0; return 1; } void dfs(int step) { if(step==n&&check(a[0]+a[n-1])==1) //全部填满而且第一个元素和最后一个元素满足就输出 { for(int i=0;i >n; a[0]=1; //因为是环所以第一个元素固定 visit[1]=1; //1已用 dfs(1); //从第一个元素开始 return 0; }