当前位置:   article > 正文

算法学习笔记

算法学习笔记

01背包问题

题目描述:

给定几件物品和一个容量为为c的背包,第i件物品的重量为wi, 价值为是 vi,每件物品只能使用1次,求解将哪些物品装入背包后物品价值的总和最


输入


输入第一行为两个整数n,c,分别表示物品数量和背包的容量,其后有n行,每行包含两个整数w, v,分别表示该物体的重量和其产生的价值。


输出


输出最大的价值总和


样例输入


5 10
2 6
2 3
6 5
5 4
4 6


样例输出


15

  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. using namespace std;
  5. int main()
  6. {
  7. int n,c;
  8. cin>>n>>c;//物品数量,背包容量
  9. vector<int>w(n+1),v(n+1);//重量和价值
  10. for(int i=1;i<=n;i++)
  11. {
  12. cin>>w[i]>>v[i];
  13. }
  14. vector<vector<int> >dp(n+1,vector<int>(c+1,0));
  15. for(int i=1;i<=n;i++)
  16. {
  17. for(int j=1;j<=c;j++)
  18. {
  19. if(j<w[i])//物品的重量大于当前背包容量
  20. {
  21. dp[i][j]=dp[i-1][j];
  22. }
  23. else
  24. {
  25. dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);//能放下当前物品:
  26. //放当前物品,不放当前物品
  27. }
  28. }
  29. }
  30. cout<<dp[n][c]<<endl;
  31. }


跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

输入

多组测试样例。每组测试样例包含一个整数n。(1<=n<=100)

输出

每组测试样例输出一行,表示青蛙跳上n级台阶的跳法数量.

所得到的结果模1000000007

样例输入

3
4

样例输出

3
5
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;//简化long long
  4. int main()
  5. {
  6. ll n;
  7. while(cin>>n)
  8. {
  9. ll *a=new ll [n+1];//开辟一个一维数组(从0开始n个数所以为n+1)
  10. a[0]=1;
  11. a[1]=1;
  12. for(int i=2;i<=n;i++)
  13. {
  14. a[i]=a[i-1]%1000000007+a[i-2]%1000000007;//最后一步跳了一个台阶或者二个台阶
  15. }
  16. cout<<a[n]%1000000007<<endl;
  17. }
  18. return 0;
  19. }

最长公共子序列

题目描述


一个字符串A的子串被定义成从A中顺次选出若干个字符构成的串。如A=“cdaad" ,顺次选1,3,5个字符就构成子串" cad" ,现给定两个字符串,求它们的最长共公子串。



输入


第一行两个字符串用空格分开。两个串的长度均小于2000 。


输出


最长子串的长度。

样例输入


abccd aecd


样例输出


3

  1. #include<iostream>
  2. #include<string.h>
  3. #include<vector>
  4. #include<algorithm>
  5. using namespace std;
  6. int main()
  7. {
  8. string str1,str2;
  9. cin>>str1>>str2;
  10. int len1=str1.size();
  11. int len2=str2.size();
  12. vector<vector<int> > dp(len1+1,vector<int>(len2+1));
  13. for(int i=1;i<=len1;i++)
  14. {
  15. for(int j=1;j<=len2;j++)
  16. {
  17. if(str1[i-1]==str2[j-1])
  18. {
  19. dp[i][j]=dp[i-1][j-1]+1;
  20. }
  21. else
  22. {
  23. dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
  24. }
  25. }
  26. }
  27. cout<<dp[len1][len2];
  28. return 0;
  29. }

三角形的路径权

题目描述


如输入样例所示出了一个数字三角形。请编一个程序计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。每一步可沿左斜线向下或右斜线向下走;1< 三角形行数< 25;三角形中的数字为整数< 1000;


输入


输入第一行为N,表示有N行 后面N行表示三角形每条路的路径权。



输出


输出路径所经过的数字的总和最大的答案。
 


样例输入


5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5


样例输出


30

  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. using namespace std;
  5. int ans=0;
  6. int main()
  7. {
  8. int n;
  9. cin>>n;
  10. vector<vector <int> >data(n+1,vector<int>(n+1,0));
  11. for(int i=1;i<=n;i++)
  12. {
  13. for(int j=1;j<=i;j++)
  14. {
  15. cin>>data[i][j];
  16. }
  17. }
  18. for(int i=1;i<=n;i++)
  19. {
  20. for(int j=1;j<=i;j++)
  21. {
  22. data[i][j]+=max(data[i-1][j],data[i-1][j-1]);
  23. if(data[i][j]>ans)
  24. {
  25. ans=data[i][j];
  26. }
  27. }
  28. }
  29. cout<<ans<<endl;
  30. return 0;
  31. }

题目描述:
问题描述:给定一个由n行数字组成的数字三角形,如图3-7所示。试设计一个算法,计算出从三角形的定制顶至底的一条路径,使该路径经过的数字总和最大。
算法设计:对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径经过的数字和的最大值。
输入
输入数据的第1行是数字三角形的行数n,1≤n≤100。接下来n行是数字三角形各行中的数字。所有数字在0...99之间。
输出
输出数据只有一个整数,表示计算出的最大值.
样例输入
5

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/193662?site
推荐阅读
相关标签
  

闽ICP备14008679号