• 2022算法分析与练习十六


    N皇后问题: 

    题目描述

    使用回溯法求解N后问题。

    7eda9837c68a1136e8c10c7de323ddfe.png

    输入

    皇后的个数。

    输出

    每一种方案及总方案数。

    样例输入 Copy

    4

    样例输出 Copy

    0 1 0 0
    0 0 0 2
    3 0 0 0
    0 0 4 0
    ----------------
    0 0 1 0
    2 0 0 0
    0 0 0 3
    0 4 0 0
    ----------------
    总方案数为:2

     本题题解

     0-1背包问题(回溯法)

    题目描述

    有n个物品,第i个物品重量为wi,价值为vi,现有一背包容量为C,要求把物品装入背包得到最大价值,并且要求出这些选取的物品。 要求用回溯法求解。

    输入

    多组测试数据,请处理到文件尾,一个整数表示物品的数量n,后一行有n个整数,代表价值,再后一行有n个整数,代表重量,最后有一个整数C代表背包容量,1<=n<=15,1<=vi<=30,1<=wi<=30,1<=C<=80。

    输出

    背包的最大总价值和所选取的物品,如果选取的方案有多种,请输出字典序最小的那种方案,每组测试数据应输出一行,在这里字典序最小的意思是,我们假设存在两种不同方案S,T所能得到的总价值相同且是最大的,对于方案S种选取|S|种物品,方案T选取|T|种物品,对于i=1,2...j-1,我们有si = ti,但sj < tj,则方案的S的字典序比方案T的字典序要小。由于没有使用special judge,所以如果选取得方案是S,请按照从小到大的顺序输出方案S中的物品下标。

    样例输入 Copy

    1. <span style="background-color:#ffffff"><span style="color:#333333"><span style="color:#333333"><span style="background-color:#f5f5f5">5
    2. 6 3 6 5 4
    3. 2 2 4 6 5
    4. 8</span></span></span></span>

    样例输出 Copy

    <span style="background-color:#ffffff"><span style="color:#333333"><span style="color:#333333"><span style="background-color:#f5f5f5">15 1 2 3</span></span></span></span>

     本题题解

     简单递归求和

    题目描述

    使用递归编写一个程序求如下表达式前n项的计算结果:  (n<=100)
    1 -  3 + 5 - 7 + 9 - 11 +......
    输入n,输出表达式的计算结果。

    输入

    多组输入,每组输入一个n,n<=100。

    输出

    输出表达式的计算结果。

    样例输入 Copy

    1
    2

    样例输出 Copy

    1
    -2
    1. #include<math.h>
    2. #include<stdio.h>
    3. #include<algorithm>
    4. #include<math.h>
    5. #include<string.h>
    6. #include<iostream>
    7. # define ll long long
    8. using namespace std;
    9. int a[105];
    10. int main(){
    11. for(int i=1,cnt=1;cnt<=100;i+=2,cnt++){
    12. if(cnt%2==0)
    13. a[cnt]=a[cnt-1]-i;
    14. else a[cnt]=a[cnt-1]+i;
    15. }
    16. int n;
    17. while(cin>>n){
    18. cout<<a[n]<<endl;
    19. }
    20. return 0;
    21. }

    简单递归求和

    题目描述

    使用递归编写一个程序求如下表达式的计算结果:  (1<n<=20)
    S(n) = 1*4 + 4*9 + 9*16 + 16*25 + ... + ((n-1)^2)*n^2
    输入n,输出表达式S(n)的结果。

    输入

    单组输入,输入一个正整数n,1<n<=20。

    输出

    输出表达式S(n)的计算结果。

    样例输入 Copy

    3

    样例输出 Copy

    40

     就是简单递归,注意递归边界和s数组初始值的设置

    1. #include<math.h>
    2. #include<stdio.h>
    3. #include<algorithm>
    4. #include<math.h>
    5. #include<string.h>
    6. #include<iostream>
    7. # define ll long long
    8. using namespace std;
    9. int s[21];
    10. int solve(int n){
    11. if(n<=1)return 0;
    12. if(n==2)return 4;
    13. else{
    14. return solve(n-1)+(n-1)*(n-1)*n*n;
    15. }
    16. }
    17. int main(){
    18. int n;
    19. cin>>n;
    20. cout<<solve(n);
    21. return 0;
    22. }

    递归求和

    题目描述

    X星人参加了一档幸运大抽奖节目,凭借无敌好运气中了一等奖。节目组给他准备了一个奖品箱,这个箱子中一共有M个格子,每个格子中只能放一个奖品。
    现在一共有N个不同的奖品供X星人挑选,不同的奖品其价值不一定相等
    “贪心的”X星人希望所挑选的奖品的价值和最大,需要你编写一个程序帮他计算出所能得到的最大价值和。

    输入

    单组输入。
    第1行包含两个正整数M和N,分别表示奖品箱中格子的数量和奖品的总数。(1< M<=10^5且1<N<=10^5)
    第2行包含N个正整数,分别表示N个奖品的价值,两两之间用空格隔开。

    输出

    奖品箱中所有奖品的最大价值和。

    样例输入 Copy

    3 5
    1 3 2 6 5

    样例输出 Copy

    14

    提交

     就是需要注意数值超过int范围,用Long long 就可以了

    1. #include<math.h>
    2. #include<stdio.h>
    3. #include<algorithm>
    4. #include<math.h>
    5. #include<string.h>
    6. # define ll long long
    7. using namespace std;
    8. bool cmp(int x,int y){
    9. return x>y;
    10. }
    11. int main(){
    12. int n,m;
    13. scanf("%d%d",&n,&m);
    14. int a[100004];
    15. for(int i=0;i<m;i++)scanf("%d",&a[i]);
    16. sort(a,a+m,cmp);
    17. ll sum=0;
    18. for(int i=0;i<n;i++)sum+=a[i];
    19. printf("%lld",sum);
    20. return 0;
    21. }

    文件存储

    题目描述

    如果有n个文件{F1,F2,F3,…,Fn}需要存放在大小为M的U盘中,文件i的大小为Si,1<=i<=n。请设计一个算法来提供一个存储方案,使得U盘中存储的文件数量最多。

    输入

    多组输入,对于每组测试数据,每1行的第1个数字表示U盘的容量M(以MB为单位,不超过256*1000MB),第2个数字表示待存储的文件个数n。
    第2行表示待存储的n个文件的大小(以MB为单位)。

    输出

    输出最多可以存放的文件个数。

    样例输入 Copy

    10000 5
    2000 1000 5000 3000 4000

    样例输出 Copy

    4
    1. #include<math.h>
    2. #include<stdio.h>
    3. #include<algorithm>
    4. #include<math.h>
    5. #include<string.h>
    6. #include<iostream>
    7. # define ll long long
    8. using namespace std;
    9. int a[1005];
    10. int main(){
    11. int M,n;
    12. while(cin>>M>>n){
    13. memset(a,0,1005);
    14. for(int i=0;i<n;i++)cin>>a[i];
    15. sort(a,a+n);//就是选小的就行了
    16. int sum=0,cnt=0;
    17. while(sum<=M){
    18. sum+=a[cnt];
    19. cnt++;
    20. }
    21. cout<<cnt-1<<endl;
    22. }
    23. }

     

     排列蛋卷

    题目描述

    刚考完研的TC同学这段时间在家闲得慌,因此他决定学点新手艺。今天他学习的内容是:做蛋卷。
    由于是第一次做蛋卷,TC同学做出来蛋卷长短不一。看着这些长度都不一样的蛋卷,TC同学的强迫症又犯了。他希望能够拿出其中部分蛋卷,使得留下来的蛋卷能够按照长度从大到小的次序排列
    请问他最少需要拿出多少根蛋卷

    输入

    单组输入,对于每一组测试数据,第1行N表示蛋卷的总数量(n<=1000)。 
    第2行包含N个正整数,分别表示每一根蛋卷的长度。(单位:厘米) 
    保证在同一组输入数据中每一根蛋卷的长度均不一样。

    输出

    输出最少需要拿出的蛋卷数量。

    样例输入 Copy

    5
    15 18 17 11 12

    样例输出 Copy

    2

     思路很简单,因为是由大到小,我们上课学的是最长递增子序列,而这个是递减子序列,直接将这个数组反转就等于递减子序列了,通过一个vector来保存数据,如果大于vector最后一个放入的数则直接放入就可以了,如果小于则找到vector则找到vector中第一个大于a[i]的数并且将它替换  

    1. #include<math.h>
    2. #include<stdio.h>
    3. #include<algorithm>
    4. #include<math.h>
    5. #include<string.h>
    6. #include<iostream>
    7. #include<vector>
    8. # define ll long long
    9. using namespace std;
    10. int a[1005];
    11. int main(){
    12. int n;
    13. cin>>n;
    14. vector<int> ve;
    15. for(int i=0;i<n;i++)cin>>a[i];
    16. reverse(a,a+n);
    17. ve.push_back(a[0]);
    18. for(int i=1;i<n;i++){//
    19. if(a[i]>ve.back())ve.push_back(a[i]);
    20. else{
    21. *lower_bound(ve.begin(),ve.end(),a[i])=a[i];
    22. }
    23. }
    24. cout<<n-ve.size()<<endl;
    25. }

     X星人的基因

    题目描述

    X星人的基因由A、B、C、D、E五种不同的结构组合而成。
    如果两个性别不同的X星人的基因序列相似度大于50%,按照X星的法律他们是禁止结婚的,等于50%据说还是可以的。
    那么基因的相似度怎么计算呢?分别从两个人身上取长度均为N的基因片段,如果它们的最长公共子序列为M,则相似度=M/N。是不是很简单呢?
    现在给你两段X星人的基因序列片段,请你判断他们是不是可以结婚?

    输入

    每一组测试数据包含3行,
    第1行数字N表示待比较基因序列片段的长度,N<=10^3。
    第2行和第3行为两个长度为N的基因序列片段。
    输入0表示结束。

    输出

    两个X星人是否可以结婚,如果可以输出”Yes“,如果不可以输出”No“。

    样例输入 Copy

    8
    A B C D E A B C
    A C C D C B A E
    6
    A B C D E E
    A E D C B B
    0
    

    样例输出 Copy

    Yes
    Yes

     思路:就是一个最长公共子序列问题,并且判断是否满足条件

    1. #include<math.h>
    2. #include<stdio.h>
    3. #include<algorithm>
    4. #include<math.h>
    5. #include<string.h>
    6. #include<iostream>
    7. #include<vector>
    8. # define ll long long
    9. using namespace std;
    10. int lcs[1005][1005];
    11. char a[1005],b[1005];
    12. int main(){
    13. int n;
    14. string str1,str2;
    15. while(cin>>n&&n!=0){
    16. for(int i=1;i<=n;i++)cin>>a[i];
    17. for(int i=1;i<=n;i++)cin>>b[i];
    18. for(int i=0;i<=n;i++){
    19. for(int j=0;j<=n;j++){
    20. if(i==0||j==0)lcs[i][j]=0;
    21. else{
    22. if(a[i]==b[j])lcs[i][j]=lcs[i-1][j-1]+1;
    23. else
    24. lcs[i][j]=max(lcs[i-1][j],lcs[i][j-1]);
    25. }
    26. }
    27. }
    28. if(lcs[n][n]*2<=n)cout<<"Yes"<<endl;
    29. else cout<<"No"<<endl;
    30. }
    31. return 0;
    32. }

  • 相关阅读:
    python爬虫top250电影数据
    LeetCode--172. 阶乘后的零(C++描述)
    Gradient
    【一个让你停不下来的动效】——难道不来瞅瞅?(含源码+思路)
    Netty线程模型
    FastAPI学习-27 使用@app.api_route() 设置多种请求方式
    Docker_搭建跨服务器网络通讯(swarm 集群)
    为后续的PCBA生产更为顺畅,这篇盖/露PAD怎么选的文章不容错过
    深入理解Linux内核进程的管理与调度(全知乎最详细)
    17.Composition API(三)高级语法补充
  • 原文地址:https://blog.csdn.net/qq_51580852/article/details/125451484