算法学习笔记

01背包问题

题目描述:

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


输入


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


输出


输出最大的价值总和


样例输入


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


样例输出


15

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
	int n,c;
	cin>>n>>c;//物品数量,背包容量 
	vector<int>w(n+1),v(n+1);//重量和价值 
	for(int i=1;i<=n;i++)
	{
		cin>>w[i]>>v[i];
	}
	vector<vector<int> >dp(n+1,vector<int>(c+1,0));
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=c;j++) 
		{
			if(j<w[i])//物品的重量大于当前背包容量 
			{
				dp[i][j]=dp[i-1][j];
			}
			else
			{
				dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);//能放下当前物品:
				//放当前物品,不放当前物品 
			 } 
		}
	}
	cout<<dp[n][c]<<endl;
}


跳台阶

题目描述

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

输入

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

输出

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

所得到的结果模1000000007

样例输入

3
4

样例输出

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

最长公共子序列

题目描述


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



输入


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


输出


最长子串的长度。

样例输入


abccd aecd


样例输出


3

#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
	string str1,str2;
	cin>>str1>>str2;
	int len1=str1.size();
	int len2=str2.size();
	vector<vector<int> > dp(len1+1,vector<int>(len2+1));
	for(int i=1;i<=len1;i++)
	{
		for(int j=1;j<=len2;j++)
		{
			if(str1[i-1]==str2[j-1])
			{
				dp[i][j]=dp[i-1][j-1]+1;
			}
			else
			{
				dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
			}
		 } 
	}
	cout<<dp[len1][len2];
	return 0;
}

三角形的路径权

题目描述


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


输入


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



输出


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


样例输入


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


样例输出


30

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int ans=0;
int main()
{
	int n;
	cin>>n;
	vector<vector <int> >data(n+1,vector<int>(n+1,0));
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=i;j++)
		{
			cin>>data[i][j];
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=i;j++)
		{
			data[i][j]+=max(data[i-1][j],data[i-1][j-1]);
			if(data[i][j]>ans)
			{
				ans=data[i][j];
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

题目描述:
问题描述:给定一个由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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值