赞
踩
给定几件物品和一个容量为为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;
- }
输入第一行为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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。